<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PrintMaster Developer Documentation on PrintMaster Docs</title><link>https://docs.printmaster.work/development/</link><description>Recent content in PrintMaster Developer Documentation on PrintMaster Docs</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://docs.printmaster.work/development/index.xml" rel="self" type="application/rss+xml"/><item><title>Auto-Update &amp; Installer Repackaging Plan</title><link>https://docs.printmaster.work/development/auto-update-plan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/auto-update-plan/</guid><description>&lt;p&gt;This document captures the agreed strategy for server- and agent-driven updates, including manifest signing, installer repackaging, and rollout choreography. It serves as a checklist we can iterate through incrementally.&lt;/p&gt;
&lt;h2 id="goals"&gt;Goals&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Enable the PrintMaster &lt;strong&gt;server&lt;/strong&gt; to self-update without user intervention (non-Docker deployments).&lt;/li&gt;
&lt;li&gt;Allow the server to orchestrate &lt;strong&gt;agent&lt;/strong&gt; updates, including fully background installations triggered from the fleet UI.&lt;/li&gt;
&lt;li&gt;Provide &lt;strong&gt;customized installers&lt;/strong&gt; (per fleet/tenant) that embed configuration data and can be used for both onboarding and update flows.&lt;/li&gt;
&lt;li&gt;Maintain &lt;strong&gt;trust&lt;/strong&gt; without external code-signing certificates by using server-signed manifests and checksum validation.&lt;/li&gt;
&lt;li&gt;Keep Docker deployments opt-in / manual since they already rely on image pulls.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="high-level-architecture"&gt;High-Level Architecture&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Release Intake&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Build &amp; Release Workflow</title><link>https://docs.printmaster.work/development/build-workflow/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/build-workflow/</guid><description>&lt;h2 id="quick-start-development"&gt;Quick Start (Development)&lt;/h2&gt;
&lt;h3 id="windows-powershell-quick-launch"&gt;Windows PowerShell Quick Launch&lt;/h3&gt;
&lt;p&gt;Use the helper script to test, build, and launch the agent:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# From project root (where dev/ exists)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pwsh&lt;/span&gt; &lt;span class="n"&gt;-NoProfile&lt;/span&gt; &lt;span class="n"&gt;-ExecutionPolicy&lt;/span&gt; &lt;span class="n"&gt;Bypass&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ps1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This script will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;go test ./...&lt;/code&gt; (exits if tests fail)&lt;/li&gt;
&lt;li&gt;Build agent into &lt;code&gt;./bin/printmaster-agent.exe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Start the built binary&lt;/li&gt;
&lt;li&gt;Open browser to &lt;code&gt;http://localhost:8080&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="manual-development-workflow"&gt;Manual Development Workflow&lt;/h3&gt;
&lt;p&gt;If you prefer manual control:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Run tests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="p"&gt;./...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Build (from project root)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="n"&gt;-o&lt;/span&gt; &lt;span class="p"&gt;./&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;printmaster-agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="p"&gt;./&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Run the agent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;./&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;printmaster-agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Open UI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Start-Process&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://localhost:8080&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The launch script is intentionally conservative - tests must pass before build and server start.&lt;/p&gt;</description></item><item><title>Deprecations and Removed Features</title><link>https://docs.printmaster.work/development/deprecations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/deprecations/</guid><description>&lt;p&gt;This document tracks features that have been removed or are pending removal, with rationale and migration notes.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="removed-features"&gt;Removed Features&lt;/h2&gt;
&lt;h3 id="candidatemib-profile-workflow"&gt;Candidate/MIB Profile Workflow&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;/strong&gt;: ✅ Removed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When&lt;/strong&gt;: Early 2025&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What&lt;/strong&gt;: Agent no longer loads or parses vendor candidate files or MIB profiles. All associated UI and HTTP endpoints removed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rationale&lt;/strong&gt;: Simplify agent, reduce maintenance cost, avoid tight coupling to vendor-specific data files&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration&lt;/strong&gt;: None required. Discovery now relies on Printer-MIB and minimal vendor-agnostic heuristics&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cleanup&lt;/strong&gt;: Any data under &lt;code&gt;mib_profiles/&lt;/code&gt; can be deleted safely&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sandbox-simulation"&gt;Sandbox Simulation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;/strong&gt;: ✅ Removed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What&lt;/strong&gt;: Sandbox feature (simulate candidates against saved walks) removed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rationale&lt;/strong&gt;: Depended on candidates/MIB profiles; added complexity without core value&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration&lt;/strong&gt;: Use built-in discovery and targeted diagnostic walks&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mib_walk-http-endpoint"&gt;&lt;code&gt;/mib_walk&lt;/code&gt; HTTP Endpoint&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;/strong&gt;: ✅ Removed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What&lt;/strong&gt;: On-demand MIB walk HTTP endpoint&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rationale&lt;/strong&gt;: Encourage bounded, targeted walks inside discovery pipeline; avoid broad, ad-hoc walks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration&lt;/strong&gt;: Use discovery and &amp;ldquo;Walk All&amp;rdquo; device action in UI where applicable; targeted walks occur automatically for confirmed printers&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="saved_ranges-http-endpoint"&gt;&lt;code&gt;/saved_ranges&lt;/code&gt; HTTP Endpoint&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;/strong&gt;: ✅ Removed (Replaced)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When&lt;/strong&gt;: October 2025&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What&lt;/strong&gt;: Legacy IP ranges endpoint&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replacement&lt;/strong&gt;: Use unified &lt;code&gt;/settings&lt;/code&gt; endpoint (GET/POST for &lt;code&gt;discovery.ranges_text&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration&lt;/strong&gt;:
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Old:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/saved_ranges&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// New:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/settings&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ranges&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;discovery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ranges_text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="manual-mib-walk-ui-functions"&gt;Manual MIB Walk UI Functions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;/strong&gt;: ✅ Removed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location&lt;/strong&gt;: &lt;code&gt;agent/web/app.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Functions&lt;/strong&gt;: &lt;code&gt;runMibWalk()&lt;/code&gt;, &lt;code&gt;runMibWalkFor(ip)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rationale&lt;/strong&gt;: Full device information now gathered automatically during discovery; deep scan pipeline provides comprehensive data collection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration&lt;/strong&gt;: Automated scanning provides all needed data&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="removed-features-previously-pending"&gt;Removed Features (Previously Pending)&lt;/h2&gt;
&lt;h3 id="old-logging-system"&gt;Old Logging System&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;/strong&gt;: ✅ Removed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When&lt;/strong&gt;: December 2025&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location&lt;/strong&gt;: Was in &lt;code&gt;agent/main.go&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Functions&lt;/strong&gt;: &lt;code&gt;logMsg(msg string)&lt;/code&gt;, &lt;code&gt;logMutex&lt;/code&gt;, &lt;code&gt;logBuffer []string&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt;: Simple timestamp-prefixed logging to in-memory buffer and file&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replacement&lt;/strong&gt;: Structured logger package (&lt;code&gt;common/logger/logger.go&lt;/code&gt;) - now used throughout codebase&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration&lt;/strong&gt;: Complete - all logging now uses &lt;code&gt;appLogger&lt;/code&gt; structured logging&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="deprecated-still-supported"&gt;Deprecated (Still Supported)&lt;/h2&gt;
&lt;h3 id="settingssubnet_scan-http-endpoint"&gt;&lt;code&gt;/settings/subnet_scan&lt;/code&gt; HTTP Endpoint&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;/strong&gt;: ⚠️ Deprecated (still works)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replacement&lt;/strong&gt;: Use &lt;code&gt;/settings&lt;/code&gt; endpoint (GET/POST for &lt;code&gt;discovery.subnet_scan&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration&lt;/strong&gt;:
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Old:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/settings/subnet_scan&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// New:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/settings&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;discovery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subnet_scan&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Removal Date&lt;/strong&gt;: v1.0 (will be removed in 1.0 release)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="migration-checklist"&gt;Migration Checklist&lt;/h2&gt;
&lt;p&gt;When removing deprecated code:&lt;/p&gt;</description></item><item><title>Device Report Proxy Worker</title><link>https://docs.printmaster.work/development/cloudflare-proxy-worker/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/cloudflare-proxy-worker/</guid><description>&lt;p&gt;This document describes the Cloudflare Worker that handles device diagnostic reports for PrintMaster.&lt;/p&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;The proxy worker receives diagnostic reports from PrintMaster agents, creates a GitHub Gist with the full diagnostic data, and returns URLs for creating a pre-filled GitHub issue.&lt;/p&gt;
&lt;h2 id="endpoint"&gt;Endpoint&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;code&gt;https://api.printmaster.work/diagnostic&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Method&lt;/strong&gt;: &lt;code&gt;POST&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Content-Type&lt;/strong&gt;: &lt;code&gt;application/json&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="request-format"&gt;Request Format&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;report&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;report_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;RPT-18B2A3C4D5E6-1234&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;timestamp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2024-01-15T10:30:00Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;agent_version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.25.7&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;os&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;windows&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;arch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;amd64&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;issue_type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;wrong_manufacturer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;expected_value&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HP LaserJet Pro M404dn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;user_message&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Device shows as Unknown instead of HP&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;device_ip&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;10.0.1.50&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;device_serial&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;VNC1234567&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;device_model&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HP LaserJet Pro M404dn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;device_mac&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;00:11:22:33:44:55&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;current_manufacturer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Unknown&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;current_model&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Unknown Printer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;current_serial&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;VNC1234567&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;current_hostname&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[hash:a1b2c3d4]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;current_page_count&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15234&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;detected_vendor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Unknown&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;detection_steps&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Querying sysDescr (.1.3.6.1.2.1.1.1.0)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;No vendor match found&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;snmp_responses&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;oid&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.1.3.6.1.2.1.1.1.0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OctetString&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HP LaserJet Pro M404dn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;hex_value&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;recent_logs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;2024-01-15T10:29:55Z [INFO] Scanning device 10.0.1.50&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="response-format"&gt;Response Format&lt;/h2&gt;
&lt;h3 id="success-200-ok"&gt;Success (200 OK)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;success&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;gist_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://gist.github.com/printmaster-bot/abc123def456&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;issue_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://github.com/printmaster-org/printmaster/issues/new?template=device-report.yml&amp;amp;title=%5BDevice+Report%5D+wrong_manufacturer+%E2%80%93+HP+LaserJet+Pro+M404dn&amp;amp;gist_url=https%3A%2F%2Fgist.github.com%2Fprintmaster-bot%2Fabc123def456&amp;amp;issue_type=Wrong+manufacturer+detection&amp;amp;expected_value=HP+LaserJet+Pro+M404dn&amp;amp;device_model=HP+LaserJet+Pro+M404dn&amp;amp;device_manufacturer=Unknown&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="error-4xx5xx"&gt;Error (4xx/5xx)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;success&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Failed to create gist: rate limit exceeded&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="cloudflare-worker-implementation"&gt;Cloudflare Worker Implementation&lt;/h2&gt;
&lt;p&gt;Create a new Cloudflare Worker with the following code:&lt;/p&gt;</description></item><item><title>Epson Remote-Mode Integration Plan</title><link>https://docs.printmaster.work/development/epson-remote-mode-plan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/epson-remote-mode-plan/</guid><description>&lt;p&gt;This document captures the concrete steps required to land Epson remote-mode support in the agent while keeping the feature isolated behind a flag and reusing the new SNMP batching helper.&lt;/p&gt;
&lt;h2 id="goals"&gt;Goals&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Reuse the remote-mode command surface documented in &lt;code&gt;docs/SNMP_RESEARCH_NOTES.md&lt;/code&gt; (commands &lt;code&gt;di&lt;/code&gt;, &lt;code&gt;st&lt;/code&gt;, &lt;code&gt;ia&lt;/code&gt;, &lt;code&gt;ii&lt;/code&gt;, &lt;code&gt;||&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Surface reliable ink, maintenance-box, and alert data in &lt;code&gt;PrinterInfo&lt;/code&gt;/metrics without relying on sparse Printer-MIB leaves.&lt;/li&gt;
&lt;li&gt;Limit SNMP chatter by batching OIDs (already covered by &lt;code&gt;batchedGet&lt;/code&gt;) and caching EEPROM ranges per device.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="building-blocks"&gt;Building Blocks&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Batching helper&lt;/strong&gt; (&lt;code&gt;agent/scanner/snmp_batch.go&lt;/code&gt;): already available; use it whenever remote-mode helpers need scalar GETs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vendor module hook&lt;/strong&gt; (&lt;code&gt;agent/scanner/vendor/epson.go&lt;/code&gt;): entry point for calling the remote-mode helper from &lt;code&gt;MetricOIDs&lt;/code&gt;/&lt;code&gt;Parse&lt;/code&gt; whenever the feature flag is on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learned OID cache&lt;/strong&gt; (&lt;code&gt;agent/agent/types.go::LearnedOIDMap&lt;/code&gt;): add an &lt;code&gt;EpsonEEPROMWindows&lt;/code&gt; slice so we remember which address ranges returned data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feature flag plumbing&lt;/strong&gt;: add &lt;code&gt;epson_remote_mode_enabled&lt;/code&gt; to agent config, default false, surfaced through settings UI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage + downsampling&lt;/strong&gt;: extend &lt;code&gt;DeviceMetricsSnapshot&lt;/code&gt; to track &lt;code&gt;main_waste&lt;/code&gt;, &lt;code&gt;borderless_waste&lt;/code&gt;, &lt;code&gt;waste_box_3&lt;/code&gt; so they flow through existing downsamplers.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="implementation-steps"&gt;Implementation Steps&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Remote-mode transport helper&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Git &amp; GitHub Integration - Complete ✅</title><link>https://docs.printmaster.work/development/git-integration-summary/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/git-integration-summary/</guid><description>&lt;h2 id="what-was-added"&gt;What Was Added&lt;/h2&gt;
&lt;h3 id="1-automated-release-script-releaseps1"&gt;1. Automated Release Script (&lt;code&gt;release.ps1&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Location&lt;/strong&gt;: &lt;code&gt;c:\temp\printmaster\release.ps1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Patch release (bug fixes)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ps1&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;patch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Minor release (new features)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ps1&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;minor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Major release (breaking changes)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ps1&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;major&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Release server or both&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ps1&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;patch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ps1&lt;/span&gt; &lt;span class="n"&gt;both&lt;/span&gt; &lt;span class="n"&gt;patch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;What it does automatically&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;✅ Checks if working directory is clean&lt;/li&gt;
&lt;li&gt;✅ Bumps version in VERSION file(s)&lt;/li&gt;
&lt;li&gt;✅ Runs all tests&lt;/li&gt;
&lt;li&gt;✅ Builds optimized release binary&lt;/li&gt;
&lt;li&gt;✅ Commits VERSION change&lt;/li&gt;
&lt;li&gt;✅ Creates git tag (e.g., v0.2.0)&lt;/li&gt;
&lt;li&gt;✅ Pushes to GitHub&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Flags&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>PrintMaster Test Coverage Analysis</title><link>https://docs.printmaster.work/development/test-coverage-analysis/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/test-coverage-analysis/</guid><description>&lt;p&gt;&lt;strong&gt;Last Updated:&lt;/strong&gt; December 27, 2025&lt;/p&gt;
&lt;p&gt;This document provides a comprehensive analysis of test coverage across the PrintMaster codebase, identifying well-tested areas, gaps, and recommendations for improvement.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="executive-summary"&gt;Executive Summary&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Test Files&lt;/th&gt;
 &lt;th&gt;Coverage Level&lt;/th&gt;
 &lt;th&gt;Priority for Improvement&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Server Storage&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;20+&lt;/td&gt;
 &lt;td&gt;⭐⭐⭐⭐⭐ Excellent&lt;/td&gt;
 &lt;td&gt;Low&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Agent Scanner&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;8&lt;/td&gt;
 &lt;td&gt;⭐⭐⭐⭐ Good&lt;/td&gt;
 &lt;td&gt;Medium&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Common Libraries&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;12&lt;/td&gt;
 &lt;td&gt;⭐⭐⭐⭐ Good&lt;/td&gt;
 &lt;td&gt;Low&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Server API/Handlers&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;⭐⭐⭐ Moderate&lt;/td&gt;
 &lt;td&gt;Medium&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Agent Storage&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;6&lt;/td&gt;
 &lt;td&gt;⭐⭐⭐⭐ Good&lt;/td&gt;
 &lt;td&gt;Low&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Reports System&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;⭐⭐⭐ Moderate&lt;/td&gt;
 &lt;td&gt;Medium&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;WebSocket/Proxy&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;⭐⭐⭐ Moderate&lt;/td&gt;
 &lt;td&gt;Medium&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;E2E Tests&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;⭐⭐ Basic&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;HIGH&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Email Templates&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;⭐ None&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;HIGH&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Spooler (Windows)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;⭐ None&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;HIGH&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Metrics Collector&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;⭐ None&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;HIGH&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Report Scheduler&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;⭐ None&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;HIGH&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;OIDC Handlers&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;⭐ None&lt;/td&gt;
 &lt;td&gt;Medium&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;JS/Frontend&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;14&lt;/td&gt;
 &lt;td&gt;⭐⭐⭐ Moderate&lt;/td&gt;
 &lt;td&gt;Medium&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="1-go-unit-tests-92-test-files"&gt;1. Go Unit Tests (92 test files)&lt;/h2&gt;
&lt;h3 id="11-server-package-server"&gt;1.1 Server Package (&lt;code&gt;server/&lt;/code&gt;)&lt;/h3&gt;
&lt;h4 id="-excellent-coverage"&gt;✅ Excellent Coverage&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;File/Package&lt;/th&gt;
 &lt;th&gt;Tests&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;storage/*_test.go&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;20+ files&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Most comprehensive testing&lt;/strong&gt; - Covers all CRUD operations, agents, devices, metrics, alerts, reports, users, sessions, tenants, settings, OIDC, dialects&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;main_test.go&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;30+ tests&lt;/td&gt;
 &lt;td&gt;Health endpoints, auth, heartbeat, batch uploads, token handling, device proxy parsing&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;config_test.go&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Multiple&lt;/td&gt;
 &lt;td&gt;Configuration loading/parsing&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;websocket_test.go&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;8+ tests&lt;/td&gt;
 &lt;td&gt;WebSocket connection, heartbeat, proxy requests&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Key storage tests:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>PrintMaster TODO</title><link>https://docs.printmaster.work/development/todo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/todo/</guid><description>&lt;p&gt;Consolidated pending features and improvements from across the codebase.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Current Version&lt;/strong&gt;: Agent v0.23.6, Server v0.23.6&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-high-priority-pre-10"&gt;🔴 High Priority (Pre-1.0)&lt;/h2&gt;
&lt;h3 id="usb-printer-support"&gt;USB Printer Support&lt;/h3&gt;
&lt;p&gt;Implemented via an IPP-USB HTTP proxy (Windows only) — see
&lt;a href="https://docs.printmaster.work/development/usb-implementation/"&gt;USB_IMPLEMENTATION.md&lt;/a&gt;. The earlier pure-Go SNMP-over-USB
plan (&lt;code&gt;gousbsnmp&lt;/code&gt;) was abandoned and never built.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; IPP-USB proxy + web-scraped metrics (Windows)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Linux/macOS USB device enumeration + proxy support&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Same metrics as network printers (page counts, toner, supplies) - USB scraping is best-effort per vendor, not at parity yet&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; USB printer configuration UI&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; USB/network printer differentiation in main devices table (currently tracked separately)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="snmpv3-support"&gt;SNMPv3 Support&lt;/h3&gt;
&lt;p&gt;Security enhancement for enterprise deployments.&lt;/p&gt;</description></item><item><title>PROJECT STRUCTURE</title><link>https://docs.printmaster.work/development/project-structure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/project-structure/</guid><description>&lt;h2 id="project-structure-overview"&gt;Project Structure (Overview)&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;printmaster/
├── agent/ # Agent service and embedded UI (Go)
│ ├── main.go # Agent entrypoint
│ ├── config.go / config.toml # Agent configuration loader + sample
│ ├── agent/ # Discovery + protocol workers (mDNS, SSDP, etc.)
│ ├── scanner/ # SNMP pipeline, vendor registry, metrics extraction
│ ├── storage/ # Embedded SQLite schema + migrations
│ ├── proxy/ / supplies/ # Proxy tunnel + consumables helpers
│ ├── featureflags/ # Toggle definitions used by agent UI
│ ├── web/ # Embedded UI assets (built into the binary)
│ └── docs/ # Agent-specific reference material
├── server/ # Multi-agent server/API hub (Go)
│ ├── main.go # Server entrypoint
│ ├── config.go / config.toml # Server configuration + defaults
│ ├── websocket.go # Agent tunnel / live proxy handling
│ ├── storage/ # Server persistence + tenancy data
│ ├── authz/, logger/, tls.go # Auxiliary subsystems
│ └── web/ # Server UI + static assets
├── common/ # Shared Go modules (config, logger, snmp, util, web)
├── docs/ # Architecture + operations documentation
├── dev/ # Local developer scripts (e.g., launch.ps1)
├── scripts/ # Operational PowerShell helpers (kill, update, etc.)
├── tools/ # Standalone utilities and generators
├── tests/ # Integration / e2e test harnesses
├── static/ # Third-party front-end assets (e.g., flatpickr)
├── ui/ # Legacy UI experiments (kept for reference)
├── logs/, test-results/ # Output folders (ignored in git)
├── build.ps1 / release.ps1 # Build + release orchestration
└── README.md # High-level overview
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="module-descriptions"&gt;Module Descriptions&lt;/h2&gt;
&lt;h3 id="agent-agent"&gt;Agent (&lt;code&gt;agent/&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Single-binary agent that discovers printers, collects metrics, persists to SQLite, and serves the embedded UI. Key subpackages:&lt;/p&gt;</description></item><item><title>Range syntax and parsing rules</title><link>https://docs.printmaster.work/development/range-syntax/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/range-syntax/</guid><description>&lt;p&gt;This file documents what the server accepts in the range editor textarea and how the &lt;code&gt;ParseRangeText&lt;/code&gt; behavior works.&lt;/p&gt;
&lt;p&gt;Supported formats&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Single IPv4 address: e.g. &lt;code&gt;192.168.1.42&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CIDR notation: e.g. &lt;code&gt;192.168.1.0/24&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Full range (start-end): e.g. &lt;code&gt;192.168.1.10-192.168.1.20&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Short-hand range (right side maps to last N octets):
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;192.168.1.10-20&lt;/code&gt; expands to &lt;code&gt;192.168.1.10&lt;/code&gt; through &lt;code&gt;192.168.1.20&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;10-20&lt;/code&gt; is interpreted relative to the default/prepended subnet only when configured in the UI as Add/Override behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Last-octet wildcard: &lt;code&gt;192.168.1.x&lt;/code&gt; or &lt;code&gt;192.168.1.*&lt;/code&gt; (expands the last octet 0..255)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Behaviors and constraints&lt;/p&gt;</description></item><item><title>Security Architecture for Agent-Server Communication</title><link>https://docs.printmaster.work/development/security-architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/security-architecture/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Historical design proposal — planned, not shipped as specified.&lt;/strong&gt; This page is retained for context and stable heading anchors, not as a description of current security guarantees or valid configuration. Its MVP/Production/Enterprise labels, code sketches, phases, quotas, retention periods, JSON/YAML examples, mTLS, request signing, certificate rotation, encrypted credential synchronization, and proxy-session isolation are proposed designs, not verified shipped behavior. Some overlapping features now exist, but that does not validate this design as a whole.&lt;/p&gt;</description></item><item><title>SNMP Reference Guide</title><link>https://docs.printmaster.work/development/snmp-reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/snmp-reference/</guid><description>&lt;p&gt;This document covers SNMP discovery, Printer-MIB OIDs, vendor detection, metrics collection, and meter history tracking in PrintMaster.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;PrintMaster uses SNMP (Simple Network Management Protocol) to discover and monitor network printers. The implementation follows a &lt;strong&gt;two-phase scan approach&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Phase 1 (Quick Probe)&lt;/strong&gt; - Small number of SNMP GETs to quickly verify device is a printer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phase 2 (Deep Scan)&lt;/strong&gt; - Targeted walk for confirmed printers to gather detailed metrics&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This approach keeps discovery fast on large networks while still capturing rich vendor-specific data.&lt;/p&gt;</description></item><item><title>SNMP Research Notes</title><link>https://docs.printmaster.work/development/snmp-research-notes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/snmp-research-notes/</guid><description>&lt;p&gt;This file captures actionable takeaways from inspecting other open-source SNMP printer discovery/management tools so we can fold the best ideas into PrintMaster without blindly copying code.&lt;/p&gt;
&lt;h2 id="sources-consulted"&gt;Sources Consulted&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ircama/epson_print_conf&lt;/code&gt; (Python) — exhaustive remote-mode OIDs plus EEPROM decoding for dozens of Epson models (&lt;a href="https://raw.githubusercontent.com/Ircama/epson_print_conf/main/epson_print_conf.py"&gt;epson_print_conf.py&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;CUPS SNMP backend (&lt;code&gt;backend/snmp.c&lt;/code&gt;) — hardened discovery logic with vendor-specific fallbacks (&lt;a href="https://raw.githubusercontent.com/OpenPrinting/cups/master/backend/snmp.c"&gt;OpenPrinting/cups&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="standard-oids-we-should-poll-everywhere"&gt;Standard OIDs We Should Poll Everywhere&lt;/h2&gt;
&lt;p&gt;These came up repeatedly in both projects and map cleanly to our existing data model:&lt;/p&gt;</description></item><item><title>Testing and CI guidelines</title><link>https://docs.printmaster.work/development/testing-ci/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/testing-ci/</guid><description>&lt;p&gt;This document describes how to write fast, deterministic tests for the PrintMaster agent and server.&lt;/p&gt;
&lt;h2 id="test-types"&gt;Test Types&lt;/h2&gt;
&lt;p&gt;PrintMaster has three levels of testing:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Unit Tests&lt;/strong&gt; - Test individual functions/packages in isolation (&lt;code&gt;agent/&lt;/code&gt;, &lt;code&gt;server/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integration Tests&lt;/strong&gt; - Test component interactions (e.g., database rotation)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;End-to-End Tests&lt;/strong&gt; - Test full agent-server communication (see &lt;code&gt;tests/&lt;/code&gt; directory)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For E2E test details, see &lt;a href="https://docs.printmaster.work/development/testing/e2e-testing/"&gt;&lt;code&gt;../tests/E2E_TESTING.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="why-mocking-is-necessary"&gt;Why mocking is necessary&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;Network operations (ICMP, TCP connect, SNMP Get/Walk) are slow and flaky in CI. Unit tests must avoid touching the real network so they remain fast and reliable. The project uses small package-level factories and interfaces to make mocking easy.&lt;/p&gt;</description></item><item><title>USB Printer Support</title><link>https://docs.printmaster.work/development/usb-implementation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/usb-implementation/</guid><description>&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: ✅ Implemented (Windows only)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;USB printer support is implemented as an &lt;strong&gt;IPP-USB HTTP proxy&lt;/strong&gt;, not the SNMP-over-USB
approach originally planned (see &amp;ldquo;Abandoned approach&amp;rdquo; below). The agent enumerates
USB printers that expose an embedded web UI over the IPP-USB interface class, then
tunnels HTTP requests to that web UI over the USB bulk endpoints — the same
approach used by &lt;a href="https://github.com/OpenPrinting/ipp-usb"&gt;OpenPrinting/ipp-usb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Metrics (page counts, toner levels, etc.) are obtained by scraping the printer&amp;rsquo;s
embedded web UI/XML endpoints, not by querying SNMP OIDs over USB.&lt;/p&gt;</description></item><item><title>WebSocket HTTP Proxy Feature</title><link>https://docs.printmaster.work/development/websocket-proxy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.printmaster.work/development/websocket-proxy/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;The PrintMaster system now supports proxying HTTP requests through the WebSocket connection between agents and the server. This allows you to access:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agent web UIs from anywhere (even behind NAT/firewalls)&lt;/li&gt;
&lt;li&gt;Device web UIs (printer admin pages) through the agent&amp;rsquo;s network connection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Transport/HTTPS claims below were checked against source snapshot &lt;code&gt;565f4c0&lt;/code&gt;; this is not a full protocol audit. Default standalone server access is &lt;code&gt;https://localhost:9443&lt;/code&gt;. HTTP &lt;code&gt;9090&lt;/code&gt; is the backend when &lt;code&gt;BEHIND_PROXY=true&lt;/code&gt; and &lt;code&gt;PROXY_USE_HTTPS=false&lt;/code&gt;, not the agent&amp;rsquo;s HTTP &lt;code&gt;8080&lt;/code&gt; port.&lt;/p&gt;</description></item></channel></rss>