MSP AI AUTOMATION PLATFORM // KNOWLEDGE BASE
AGENT PIPELINE TRACKER
The Agent Pipeline Tracker is the central registry for every AI agent across the MSP AI Automation Platform. It tracks each agent from first idea through design, build, testing, and live production — with milestone date tracking, handoff visibility, a tabled parking lot, and print-ready status reports for stakeholder communication.
File
agent-version-tracker.html
Storage (local)
localStorage key: axis_agent_tracker_v1
Storage (SP)
pages/config/current/agent-tracker-data.json
Nav
Injected via nav.js (sub-page pattern)
Proxy Required
No — browser-native + SP REST API
Overview
What Is This Tool

The Agent Pipeline Tracker is a self-contained, browser-native HTML dashboard — no server, no Node.js proxy, no database required. Every agent record is persisted either in browser localStorage (instant, always available) or to a JSON file on SharePoint via the SP REST API (production mode for team-shared state).

The tracker was built to answer the question every MSP automation program runs into: "What agents do we have, where are they, who owns them, and when are they expected to hand off to the next stage?" That answer lives here, visible to anyone with access to the SharePoint page.

Audience: ITE Team leads, consultants, account managers, and executive stakeholders via the print report. Technicians use the Handoff column to know when new work items are landing on their plate.

Current state: Fully functional. localStorage mode works in any browser without configuration. SharePoint persistence mode requires one line of config (SP_SITE) and the target folder to exist in SharePoint. The print report generates a professional PDF-ready status report with branding, RAG status, risk dashboard, and milestone timeline.

Overview
Integration Status
Storage & Persistence
LIVE
localStorage — primary fallback, always live
No config needed · survives page reload · single-user
SharePoint REST API — team-shared JSON persistence
Set SP_SITE to activate · requires folder to exist
Export / Import JSON — manual backup via ⬇ Export button
Always available regardless of SP status
Print Report — generates branded HTML report, opens print dialog
Always available · PDF via browser Save as PDF
QR Code (in reports) — links back to live tracker page
api.qrserver.com · requires internet on report generation
Real-time push / websockets — multi-user live sync
Not implemented — SP polling workaround available
Overview
System Architecture

Unlike the rest of the platform suite, the Agent Tracker requires no Node.js proxy. It uses two complementary persistence paths: localStorage for always-available fallback, and the SharePoint REST API directly from the browser for production team-shared state.

The SharePoint REST API is accessible from within a SharePoint ASPX page context because the browser is already authenticated as the logged-in user. The X-RequestDigest token is fetched from /_api/contextinfo and passed with every write operation.

┌────────────────────────────────────────────────────┐ │ agent-version-tracker.html (browser) │ │ │ │ loadAgents() → SP REST API → agents[] │ │ ↘ localStorage fallback if SP fails │ │ │ │ saveAgents() → SP REST API (Files/Add overwrite) │ │ → localStorage mirror (always) │ │ │ │ generateReport() → window.open() → print dialog │ │ exportJSON() → Blob download │ └───────────────────────┬────────────────────────────┘ │ SP REST API (same origin) ▼ SharePoint Online GET /_api/contextinfo ← digest token GET /_api/web/getfilebyserverrelativeurl ← read JSON POST /_api/web/GetFolderByServerRelativeUrl/Files/Add ← write JSON Data file: /sites/{site}/pages/config/current/agent-tracker-data.json
Sub-page pattern This dashboard is a sub-page of the platform. It does not include its own top navigation. nav.js is injected at the top of the file and renders the platform nav bar. The brand name override (Agent Tracker) is applied via a DOMContentLoaded listener immediately after nav.js loads, replacing the default platform brand text.
SharePoint ASPX vs HTML When hosted on SharePoint, the file is converted to ASPX. SharePoint's sandboxed page context blocks localStorage in some tenants and applies Content Security Policy restrictions. The tracker handles this gracefully: if localStorage fails it reports a storage-full warning; if the SP REST write fails it falls back to localStorage and shows an amber indicator in the top bar.
Overview
Agent Data Model

Each agent is a plain JavaScript object. The full shape is documented below. All fields except name are optional — the tracker degrades gracefully when fields are missing.

const agentShape = { name: "Ticket Triage Classifier", // required — display name requestor: "Mike Krawczyk", // person who requested the agent owner: "ITE Team", // team/person building it phase: "live", // idea|design|build|test|live|deprecated priority: "high", // high|med|low desc: "Classifies inbound tickets...", notes: "Running stable for 4 months...", // blockers, context tags: ["noc", "llm"], // multi-select array created: "2026-01-10T09:15:00.000Z", // ISO — set on first save // Milestone dates — ISO date strings (YYYY-MM-DD) est_build: "2026-02-01", // estimated move to Build est_test: "2026-02-28", // estimated move to Test est_live: "2026-03-15", // estimated go-live went_live: "2026-03-10", // actual production date (auto-stamped) };
Available Tags
Tag ValueLabelSpecial Behavior
copilotCopilot
securitySecurity
nocNOC
financeFinance
hrHR
llmLLM
intakeIntake
reportingReporting
rebuild⚠ RebuildOrange checkbox accent
deprecated☽ DeprecatedGrey checkbox accent
tabled⏸ TabledRoutes agent to Tabled view only. Hidden from all other phase filters.
Panels & UI
Summary Cards

Six summary cards sit at the top of the dashboard. They are computed from the agents[] array each time renderSummary() is called — which fires on every save, delete, phase change, and initial load.

Card Definitions
COMPUTED CLIENT-SIDE
CardDOM IDValueColor
Totals-allagents.lengthCyan
Ideas-ideaCount where phase === 'idea'Yellow
Designs-designCount where phase === 'design'Purple
Builds-buildCount where phase === 'build'Cyan
Tests-testCount where phase === 'test'Orange
Lives-liveCount where phase === 'live'Green
Tabled agents are excluded from all summary counts Agents tagged tabled do not increment any card counter — not even Total. This is intentional: tabled agents are parked, not active pipeline. The Total card reflects active tracked work only.
Panels & UI
Toolbar & Filters

The toolbar sits between the summary cards and the main view. All controls are in a single row. Left to right: Add Agent, view toggle (Table / Board), SharePoint status dot, phase filter dropdown, search input, agent count, Export button, Print button.

Toolbar Controls
ControlFunctionNotes
+ Add AgentOpens the new agent modal with blank fields. Phase defaults to Idea.Keyboard: Ctrl+Enter to save while modal is open
☰ TablesetView('table') — shows the sortable table viewDefault view on load
⊞ BoardsetView('kanban') — shows the phase column boardCards grouped by phase
● SharePointStatus indicator — shows save/load stateGreen = SP saved · Yellow = SP unavailable, local cache · Blue = in-flight
Phase FiltersetFilter(value) — filters table and board to selected phaseOptions: All Phases, Idea, Design, Build, Test, Live, ⏸ Tabled
SearchLive text filter on name, requestor, description, owneroninput="renderAll()" — no debounce
⬇ ExportexportJSON() — downloads agent-tracker-{date}.jsonAlways available, uses Blob URL
⎙ PrintprintStatusReport() — opens pre-print dialog modalSee Print Report section
● Editing Free / ● EditingtoggleEditClaim() — claims or releases editing sessionSession-scoped social lock · auto-clears on tab close · see Edit Claim Button section
Filter state and board interaction currentFilter is a module-level variable. Switching between Table and Board views preserves the active filter. When a specific phase filter is active in Board view, cards render in 2-column layout and are sorted by priority (High → Med → Low) regardless of the table sort setting.
Panels & UI
Edit Claim Button

The Edit Claim button is a lightweight session-scoped editing signal designed to mitigate the last-write-wins limitation of the shared SharePoint JSON file. It does not block saves or prevent anyone from editing — it is a social convention that tells teammates "I am actively editing right now."

The button sits in the toolbar immediately to the right of the SharePoint status dot. It uses sessionStorage — not localStorage — so the claim automatically clears the moment the browser tab is closed or the browser is quit. No stale locks. No manual cleanup required.

Button States
SESSION-SCOPED
StateAppearanceMeaningsessionStorage
Unclaimed ● Editing Free — yellow dot, subtle border No one has claimed this session. May be safe to edit, but confirm with team if unsure. Not set
Claimed ● Editing — green glowing dot, green border This browser tab has claimed the editing session. Team should wait or check with you before making changes. axis_edit_claim = '1'
Behavior Details
01
Claiming a session Click the button once. It turns green and displays "Editing." sessionStorage.setItem('axis_edit_claim', '1') is set. The claim is now visible in this tab.
02
Releasing a session Click the button again while green. It returns to yellow "Editing Free." sessionStorage.removeItem('axis_edit_claim') is called. Signal is released for the next editor.
03
Tab or browser close The claim clears automatically — no action needed. sessionStorage is scoped to the browser session and wiped on close by the browser itself.
04
Page reload within same tab The claim survives a reload within the same tab. sessionStorage persists across page reloads but not across tab closes. An initEditClaim() IIFE on load restores the green state if the claim is still set — so refreshing while editing keeps the signal active.
05
What it does NOT do It does not prevent other users from saving. It does not show other users' claim status (that would require a server). It does not block inline edits or the Add Agent modal. It is purely a visible signal in your own browser — the team convention is to look at the tracker page and ask "is someone's tab showing green?" before making bulk edits.
Recommended team workflow Before making changes: click the button to go green. Make your edits. When done: either close the tab (auto-release) or click the button to return to yellow. If you see yellow and the page was recently saved by someone else, reload before editing to get the latest SP version first.
Claim state is browser-local only Other team members on separate computers or tabs do not see your claim status. This is a discipline-based system, not a technical lock. For teams that need a true distributed lock, a server-side presence solution (e.g. storing a claim record in SharePoint with a timestamp) would be required.
Panels & UI
Table View

The table is rendered by renderTable() and uses filteredAgents() to apply the current filter and search. Columns are sortable. Cells are inline-editable — name, requestor, description, and owner fields are <input> elements that call updateField() on change and auto-save.

Table Columns
#ColumnEditableSortableNotes
1#NoNoRow number within current filtered set
2Agent NameInlineYesClickable sort · bold weight
3PhaseDropdownNoClick phase badge to open inline dropdown · changing phase clears downstream est dates (regression logic)
4PriorityClick-cycleNoClick to cycle High → Med → Low → High
5RequestorInlineNo
6DescriptionInlineNoFull-width input · expands to content
7OwnerInlineNo
8HandoffNoNoComputed — see Handoff Column section
9AddedNoYescreated field formatted as "Mar 24"
10NoNoDelete button — no confirmation dialog
Inline edits trigger immediate saves Every onchange event on an inline field calls updateField()saveAgents(). This means a typo mid-edit may trigger a save. This is intentional — no explicit Save button is needed. If SharePoint is configured, the write fires on every field exit.
Panels & UI
Board View

The Board view (renderKanban()) shows agents as cards grouped into 5 phase columns: Idea, Design, Build, Test, Live. Tabled agents never appear in normal board columns — they have their own dedicated view.

Each card shows: agent name + next handoff chip, requestor, description (truncated to 90 chars), tags, progressive date strip (for agents with dates set), and a footer with priority badge and added date. Clicking any card opens the edit modal.

Board Behavior by Filter
Filter ActiveLayoutSortTabled Column
All Phases5 columns, 1fr eachUser's current sort settingHidden
Single phase (Idea–Live)Single column, 2-col card gridPriority: High → Med → LowHidden
⏸ TabledSingle tabled columnAs storedShown — only view
Progressive date strip On board cards, agents with any milestone dates show a compact timeline strip below the tags: →Build Jan 23 › →Test Feb 14 › Est.Live Mar 9 › ✓ Live Mar 10. Each milestone is color-coded by type. The strip renders for all phases (Idea through Live).
Panels & UI
Tabled View

The Tabled view is a parking lot for agents that are on hold — waiting for a policy decision, vendor access, budget approval, or a dependency that hasn't cleared yet. Tabled agents are invisible everywhere else in the tracker — they do not appear in any phase filter, any board column, or any summary card count.

To table an agent: open the edit modal, check the ⏸ Tabled tag. To un-table: uncheck it and re-save.

The Tabled filter is available in both Table and Board views. In Board view, a single purple-accented column appears with all tabled agents showing their original phase as a badge, so you know where they'll re-enter the pipeline when unblocked.

Tabled is a tag, not a phase A tabled agent retains its phase value. When you untable it, it re-appears in its original phase column and filter. Notes should explain why it was tabled — the tracker has no separate "tabled reason" field.
Panels & UI
Handoff Column

The Handoff column in the table view is designed for technicians — it answers "when is the next thing landing on my plate?" at a glance. It shows one primary date prominently and any other set dates dimmed below it.

Handoff Display Logic by Phase
Agent PhasePrimary DisplaySecondary (dimmed)
Idea→ Build date (if set) with countdown
Design→ Build date prominently with countdown→ Test date dimmed
Build→ Test date prominently with countdown→ Build (past), Est. Live dimmed
TestEst. Live prominently with countdown→ Build, → Test (past) dimmed
Live✓ Live [date] in greenEst. was [original estimate] dimmed for accuracy review
No dates set— (dash)
Countdown Color Logic (Stage-Aware)
AT_RISK_DAYS

The color of the countdown chip is not a flat threshold — it adapts to the typical duration of each stage. Longer stages get more runway before turning yellow. Config lives in AT_RISK_DAYS at the top of the script block.

Date FieldSet During PhaseTurns Yellow AtTurns Red At
est_buildIdea14 daysPast due
est_buildDesign10 daysPast due
est_testDesign / Build14 daysPast due
est_liveBuild10 daysPast due
est_liveTest7 daysPast due
Config & API
Config Fields

All configuration is at the top of the script block, clearly marked. No build step, no env file — just edit the constants directly in the HTML file.

// ══════════════════════════════════════════════════════ // ── SHAREPOINT STORAGE CONFIG ────────────────────────── // Set SP_SITE to your SharePoint site-relative path // e.g. /sites/mysite or /sites/ITPortal // Leave as '' if this page lives at the root site. // Data file: {SP_SITE}/pages/config/current/agent-tracker-data.json // ══════════════════════════════════════════════════════ const SP_SITE = ''; // ← SET THIS const SP_DATA_FILE = 'agent-tracker-data.json'; const SP_DATA_FOLDER = (SP_SITE || '') + '/pages/config/current'; const SP_FILE_URL = SP_DATA_FOLDER + '/' + SP_DATA_FILE; // localStorage fallback key const STORAGE_KEY = 'axis_agent_tracker_v1';
Config Reference
ConstantDefaultDescription
SP_SITE''The only field you must set. SharePoint site-relative path, e.g. /sites/mysite. Empty string = root site.
SP_DATA_FILEagent-tracker-data.jsonFilename of the JSON file written to SharePoint. Do not change unless you have multiple tracker instances.
SP_DATA_FOLDER{SP_SITE}/pages/config/currentComputed from SP_SITE. The folder must exist in your SharePoint document library before first save.
STORAGE_KEYaxis_agent_tracker_v1localStorage key. Change only if you need isolated instances on the same domain.
AT_RISK_DAYS — Stage Threshold Config

Risk thresholds are configured in the AT_RISK_DAYS object near the top of the script. Values represent days before the est. date when the chip turns yellow (warning). Change these to match your team's actual sprint cadences.

var AT_RISK_DAYS = { est_build: { idea: 14, design: 10 }, // warn 14d out from Idea, 10d from Design est_test: { design: 14, build: 14 }, est_live: { build: 10, test: 7 }, // test phase: tightest — 7d warning };
Config & API
Exact API Endpoints Used

The tracker uses exactly three SharePoint REST API endpoints — all called from within the browser using the user's existing SharePoint authentication session. No credentials are stored in the file.

SharePoint REST Endpoints
SP REST API
MethodEndpointPurposeCalled By
POST {origin}{SP_SITE}/_api/contextinfo Obtain FormDigestValue (X-RequestDigest token) required for write operations getSPDigest()
GET {origin}/_api/web/getfilebyserverrelativeurl('{SP_FILE_URL}')/$value Read the agent JSON file from SharePoint. Returns 404 on first run (before any save). loadFromSP()
POST {origin}{SP_SITE}/_api/web/GetFolderByServerRelativeUrl('{SP_DATA_FOLDER}')/Files/Add(url='{SP_DATA_FILE}',overwrite=true) Write (overwrite) the agent JSON file. Requires X-RequestDigest header. saveToSP()
External Services
ServiceURL PatternPurposeRequired?
Google Fonts fonts.googleapis.com JetBrains Mono, Exo 2, Inter fonts for the dashboard UI No — degrades to system fonts if offline
QR Server api.qrserver.com/v1/create-qr-code/?size=80x80&data={url} Generates QR code in print reports linking back to live tracker No — only used during report generation · broken image if offline
Request headers on SP writes Every write to SharePoint includes: Accept: application/json;odata=verbose, Content-Type: application/json;odata=verbose, and X-RequestDigest: {token}. The digest token expires after ~30 minutes — the tracker fetches a fresh one on every save, so long-running sessions are safe.
Config & API
Risk Thresholds & Filtering Logic

The filteredAgents() function is the single source of truth for what appears in every view. Understanding its rules prevents confusion about why agents appear or disappear.

filteredAgents() rules: if currentFilter === 'tabled': → return agents where tags includes 'tabled' → apply search filter → tabled agents NEVER appear in any other filter else (all other filters including 'all'): → exclude agents where tags includes 'tabled' → if filter !== 'all': filter by phase === currentFilter → apply search filter (name, requestor, desc, owner) → apply currentSort
Deprecated agents appear in normal views Agents tagged deprecated are NOT hidden from normal filters. They appear in their phase column (typically "live" with deprecated tags) unless explicitly filtered. If you want them hidden, use the Tabled tag instead, or add a dedicated deprecated filter in a future version.
Seed Data Behavior

The seed data block loads only if localStorage is empty or contains data from before milestone date fields were added (i.e., no agent has est_build, est_test, or est_live). Once any agent has milestone fields, the seed never overwrites. To force a fresh seed: run localStorage.removeItem('axis_agent_tracker_v1') in the browser console and reload.

Config & API
Known Limitations
Current Limitations
KNOWN
LimitationImpactWorkaround / Notes
No real-time multi-user sync Two users saving simultaneously will overwrite each other's changes (last write wins) Use the Edit Claim button in the toolbar as a session signal. Click to go green before editing; releases automatically on tab close. Establish team convention: see green = ask first. Also reload before editing to pull the latest SP version.
SP write requires folder to pre-exist First save fails with 400 if pages/config/current/ folder doesn't exist in the SP library Create the folder manually in SharePoint once before first use.
localStorage blocked in some SP tenants SP sandboxed pages may block localStorage writes; fallback warning shows in toolbar Use SharePoint persistence mode (SP_SITE configured) as primary — does not depend on localStorage.
No attachment support Cannot attach design docs, screenshots, or runbook links to an agent record Use the Notes/Blockers field for SharePoint links. Consider adding a URL field in a future version.
No audit trail / version history No record of who changed what or when, beyond the SharePoint file version history SharePoint version history on the JSON file provides a basic backup. Enable versioning on the document library.
QR code requires internet QR code in print reports is fetched from api.qrserver.com at report generation time If offline, the QR image is broken but the report is otherwise complete.
Print table truncates long text Description capped at 140 chars, Notes at 100 chars in printed reports Intentional for layout consistency. Full text is visible in the tracker.
SharePoint Deploy
SharePoint Configuration

SharePoint persistence requires one config change and one manual step in SharePoint before the first save. Once configured, saves happen automatically with every change — the same as the rest of the platform suite.

// Step 1: Open agent-version-tracker.html and find this block: const SP_SITE = ''; // ← change to your site path // Examples: const SP_SITE = '/sites/ITPortal'; // site collection const SP_SITE = '/sites/AXISPlatform'; // another example const SP_SITE = ''; // root site (leave blank)
Finding your SP_SITE value Go to your SharePoint site. Copy the URL path segment between the domain and the page path. Example: https://contoso.sharepoint.com/sites/ITPortal/Pages/tracker.aspxSP_SITE = '/sites/ITPortal'. If the page lives at https://contoso.sharepoint.com/Pages/tracker.aspx → leave SP_SITE empty.
SharePoint Deploy
SharePoint Activation Checklist
Steps to Activate SharePoint Persistence
01
Create the data folder in SharePoint Navigate to your SharePoint document library. Create folders: pagesconfigcurrent. The full path must exist: /sites/{your-site}/pages/config/current/. You only need to do this once.
02
Set SP_SITE in the HTML file Open agent-version-tracker.html. Find const SP_SITE = ''; near the top of the <script> block. Replace the empty string with your site-relative path (e.g. '/sites/ITPortal').
03
Upload / convert to ASPX on SharePoint Upload the HTML file to SharePoint and convert it to an ASPX page (or paste the content into a SharePoint page editor). The file must be served from within the SharePoint context for the REST API calls to be same-origin authenticated.
04
Confirm SP save on first edit Open the page, make any change to an agent (e.g. edit a name). Watch the toolbar status indicator. It should flash ↑ Saving… in blue then ✓ Saved to SharePoint in green. If it shows yellow ⚠ SP unavailable — saved locally, the SP configuration is incorrect.
05
Clear old localStorage data (optional) If you want the fresh seed data to load (with all demo agents and milestone dates), run this in the browser console on the SP page: localStorage.removeItem('axis_agent_tracker_v1') then reload. This only affects your browser — other users get the SP version.
06
Enable versioning on the SP document library In SharePoint, go to Library Settings → Versioning Settings → enable version history. This gives you a backup audit trail of the JSON file. Recommended: keep 10–20 versions.
07
Verify nav.js brand override After the page loads, the top-left brand text should read Agent Tracker (not the platform default). If it still shows the default brand name, confirm the DOMContentLoaded override script runs after nav.js without error.
SharePoint Deploy
Troubleshooting
Common Issues
SymptomCauseFix
Yellow "SP unavailable — saved locally" on every save SP_SITE is wrong, SP folder doesn't exist, or CORS / CSP is blocking the fetch 1) Verify SP_SITE matches your actual site path. 2) Confirm pages/config/current/ folder exists. 3) Check browser console for 400/403/404 from the SP REST call.
First save succeeds but subsequent saves fail X-RequestDigest token expired (30-min window) The tracker fetches a fresh digest on every save — this should self-heal. If it doesn't, check if /_api/contextinfo is returning a non-200 status.
Data reverts to seed / old data on reload SP load is failing and localStorage has stale data, OR seed guard is triggering Check console for SP GET errors. If seed keeps loading, run localStorage.removeItem('axis_agent_tracker_v1') and confirm SP data file exists at the correct path.
Print report opens blank or errors in console Content Security Policy on SharePoint blocks window.open() or the generated document SP may block popups. Allow popups for your SharePoint domain in the browser. Alternatively, the report can be refactored to open as an iframe overlay instead of a new window.
QR code shows broken image in PDF No internet access when report was generated, or api.qrserver.com is blocked by network policy Expected behavior offline. The rest of the report is unaffected. If this is a recurring issue on corporate network, remove the QR code img tag from generateReport().
Tabled agents still show in All Phases board view Agent was tagged Tabled but board view wasn't refreshed, or tag wasn't saved Confirm the agent has "tabled" in its tags array (check via Export JSON). Trigger a manual refresh by switching views. If tags aren't saving, check for inline-edit auto-save errors in console.
Phase regression clears dates unexpectedly Moving phase backward in the inline dropdown triggers setPhase() which clears downstream dates Expected behavior — documented in Data Model section. Use the edit modal instead of the inline dropdown if you want to move phase backward while preserving dates manually.
Nav bar shows "CYBERADVISORS" instead of "Agent Tracker" nav.js brand override script isn't running, or DOMContentLoaded fired before nav.js injected the element Confirm the override <script> block immediately follows <script src="../nav.js"></script> in the file. Check console for errors in the override block.
Summary cards count is wrong Tabled agents being included, or phase mismatch Tabled agents intentionally excluded from counts. If a non-tabled agent is missing from counts, verify its phase field matches exactly (lowercase: idea/design/build/test/live).
Inline edit doesn't save SP write fails silently on onchange, or localStorage is full Check the toolbar status indicator immediately after editing a field. Yellow = SP fail (check console). "⚠ Storage full" = localStorage is full (rare — clear old data or switch to SP-only mode).
MSP AI AUTOMATION PLATFORM // AGENT PIPELINE TRACKER // KB v1.0 // 2026