Releases: Djtony707/TITAN
v6.1.0-beta.10 — Verify-after-write, assertion counter, SSE stream, small-viewport polish
v6.1.0-beta.10 — 2026-05-16 — Verification stuck-loop detector + live event stream
Two follow-ups on the beta.9 verify-after-write foundation:
Driver-loop assertion-failure counter
When a specialist's spawn produces an artifact that fails its
post-write check (byte-count drift, magic-header mismatch, partial
write), the driver loop now increments a per-subtask
consecutiveAssertionFailures counter. Three failures in a row on
the same subtask force a verify_fail block — preventing the
"specialist keeps reporting success but the artifact never matches"
stuck-loop pattern. A passing verification resets the counter.
Pairs with the existing consecutiveIdenticalErrors (catches
repeated tool throws) and consecutiveNeedsInfoCount (catches empty
needs_info loops) — three independent termination paths now defend
the driver from different stuck-loop shapes.
GET /api/verification/stream (Server-Sent Events)
New SSE endpoint that pushes every verification event as it happens
(file_write / file_append / file_edit / image_download /
browser_fetch). On connect the server replays the last 32 events
as a snapshot frame so a fresh subscriber sees current state
without polling. Heartbeat every 15 s keeps proxies from reaping
the connection.
Subscribed by the Mission Canvas trust line in a follow-up UI ship.
Tests
- 5 new tests in
tests/verification.test.ts(24 total) for
verificationEventsSincetime + kind filtering and for
subscribeVerificationfan-out, unsubscribe, and listener
isolation (a thrown listener does not break the recorder). - 57 driver-state tests continue to pass with the new branch.
No API contract changes. No schema changes. No new dependencies.
v5.4.1 — 🛡️ Layer Reliability
Patch release. Tightens the provider, UI, mesh, and config layers around
the v5.4.0 framework so every transient failure has a predictable,
testable recovery path. 1057 deterministic tests pass in 19s across
41 files. Typecheck clean.
Created by Tony Elliott aka djtony707.
Added
Per-model output clamping (Kimi)
- New
src/providers/modelCapabilities.ts— central source of truth for
every provider's context-window + max-output ceiling, plus a family-
pattern fallback for unknown specific versions and a config override
hook (providers.modelCapabilities[<model>]). clampMaxTokens(model, requested)is now called inside Anthropic,
OpenAI, OpenAI-compatible, Google, and Ollama providers.DEFAULT_MAX_TOKENS
becomes a "user-preference ceiling" (bumped to 200K) — the clamper
silently lowers it to each model's real ceiling so the caller can ask
for a high default without 400-ing on capped providers.
Retry/failover stream events (no more text-leak)
- New
retryvariant onChatStreamChunk(discriminated union in
src/providers/base.ts). Pre-fix the router yielded
\n[Retrying request (1/4) due to rate_limit...]\n\nas atext
chunk, which leaked retry banners straight into the assistant's
response. agent/agentLoop.tsconsumers now haveonRetry/onFailover
callbacks; chunk handlers route retry/failover branches out-of-band
(logged + callback fired, never appended tostreamContent).- Gateway emits dedicated
event: retryandevent: failoverSSE
frames so the UI can render status indicators without parsing the
text stream.
New Issue dialog in the sidebar
ui/src/components/layout/TitanSidebar.tsx— the Quick Create button
now opens a Modal that posts to/api/command-post/issuesand
navigates to the new issue. Pre-fix the button had an emptyonClick.
5 Hunt regression tests
tests/hunt-regression.test.tsadds top-level describes for Findings
#16 (sanitizer false-positive), #21 (narrator preamble + minimax XML
leak), #28 (dangerous-shell invariants), #30 (brokennpm install),
#37 (Retry-After plumbing).
Fixed
Gemini tool message serialization (src/providers/google.ts)
- New strict pre-serialization validation: every
function_response
must have a non-emptynamepaired with atool_call_idthat
references a recorded priortool_callin the conversation. Drops
malformed tool messages with a logged warning instead of forwarding
them and triggering Gemini's opaque 400 response. - Optional debug dump:
GOOGLE_DUMP_REQUEST_BODY=1(or
providers.google.dumpRequestBody: true) writes failing request
bodies to~/.titan/debug/gemini-requests/for post-mortem.
Streaming fallback success recording (src/providers/router.ts)
tryFallbackChainStreamused to callrecordSuccess(provider)the
moment it acquired the generator — before any chunk had been
produced. The breaker booked optimistic success for streams that
errored mid-flight. Replaced with amonitored()wrapper that books
success only after the underlying stream completes without throwing,
and books failure on error chunks or thrown errors. Same wrapping
applied to the priority-failover loop.
Provider failover beyond first attempt (src/providers/router.ts)
- The priority-failover loop was gated by
attempt === 0; if the
initial attempt was retryable but exhausted, no failover was tried.
Replaced withpriorityFailoverAttemptedandfallbackChainAttempted
latches so both fallback paths are reachable on any exhausted-retry
attempt — and each is attempted at most once perchatStreamcall.
Mesh multi-hop reply routing (src/mesh/transport.ts)
route_forwardsendReplyno longer blindly writes to the inbound
socket. Forwarded requests can arrive via intermediate hops; the
reply now usesrouteMessageMultiHopkeyed on the original requester
id (carried throughpayload.originalRequesterId) and falls back to
the inbound socket only as a last resort. Added a matching
task_responsehandler for the requester end so multi-hop replies
resolve pending requests.
Mesh stale route invalidation (src/mesh/transport.ts)
findNextHopnow validates the next-hop's WebSocket state in addition
to checkinglastUsedAtstaleness — a closed socket no longer sits
in the routing table for the full 5-minuteROUTE_STALE_MSwindow.- New
invalidateRoutesVia(nodeId)is wired into both inbound and
outbound WebSocket close + error handlers. Triggers an immediate
distance-vector broadcast so the rest of the mesh converges in
seconds rather than waiting for the next periodic cycle.
pendingApproval hook return value (ui/src/hooks/useSSE.ts)
- The hook always returned
pendingApproval: falseregardless of SSE
content because the variable that tracked it was a closure-local
insidesend(). Promoted to auseState(isPendingApproval)so the
returned value reflects state across renders, with reset on each new
send.
Config drift visibility (src/config/config.ts)
- New recursive diff between
rawConfigand the Zod-parsed result —
unknown keys at any nesting depth are now logged with their full
dot-notation path (e.g.
Unknown config key: providers.anthropic.unknownField). Pre-fix only
top-level unknown keys were warned about. Strictly informational —
never blocks startup.
Log parser regex documentation (ui/src/api/client.ts)
- Added a 12-line comment documenting the gateway log line format
(YYYY-MM-DD HH:MM:SS <LEVEL> <COMPONENT> <message>) and the
history of the corruptedDEnalternation that briefly hid every
ERROR/WARN entry from the dashboard.
Test description drift (tests/providers.test.ts)
'should contain exactly 31 presets'→'32 presets'(matches the
assertion that already required 32). Maintainer note added so the
description and the assertion stay in sync next time.
v5.4.0 — 🧠 Real Framework
Phase 9 release. Lifts TITAN from "agent that runs" to "agent that
remembers, doesn't fabricate, doesn't leak, and survives flooded inboxes."
Eight tracks across two co-working agents (Claude + Kimi K2.6) landed in a
single bundle.
728 deterministic tests pass in 7.80 s. Typecheck + UI build clean.
Created by Tony Elliott aka djtony707.
Added
Track B — Memory upgrades
src/memory/index.ts(NEW) — inverted-index TF-IDF keyword search.
Sub-50 ms query at 5 000 episodes (verified viatests/unit/memory-index.test.ts).
Wired intosearchMemory,addEpisode,enforceMemoryBounds.addEpisodenow accepts{ awaitEntities: true }to close the entity-
extraction race window — replaces the brittle "wait 100 ms and hope" pattern.enforceMemoryBoundsnow prunes entities by salience score
(typeWeight × (1 + episodeRefs + facts)) instead of FIFOlastSeen.
Identity entities (person, project) survive log floods that previously
evicted them.memory.vectorSearchEnableddefault flippedfalse → true. Silent
fallback contract preserved — installs without Ollama running don't break.
Track D — Fabrication guard
src/safety/fabricationGuard.ts(NEW) — pattern detection across six
categories (file_write / file_edit / file_delete / shell_run /
web_action / tool_used). All patterns require first-person voice and
cross-check against tool history.verifyFileWriteClaim(path, expected?)— SHA-256 hash check, lenient
trailing-whitespace compare, doesn't throw on invalid paths.buildNudgeMessage(findings)— blunt corrective text for the next turn.
Track A — Sub-agent safety (Kimi)
- Stall detection (3 identical responses → bail).
- Loop detection (identical tool+args fingerprint → bail).
- Per-tool error wrapping (returns
ToolResultinstead of throwing). - Tool output summarization (>10K chars truncated with marker).
- Graceful degradation (all tools fail → early bail with error summary).
Track C — Self-improvement activation (Kimi)
- Checkpoint-before-mutation + auto-rollback on score drop.
- Rate limiting (max 1 mutation/hour via
canMutate/recordMutation).
Fixed
Operational session leak (Phase 9 hotfix)
- TITAN PC v5.3.2 accumulated 755 in-memory sessions in 29 min. Root
cause: every endpoint that internally callsprocessMessagewith a
templated channel name (autoresearch-trigger-${type},
twilio-call-${callSid},initiative-fix,monitor,mesh,
deliberation,eval) created a unique cache key under
${channel}:${userId}:${agentId}— and all sessions shared the same
30 min idle TTL. At ~26 sessions/min creation rate, the 30 min window
buffered 750+ entries before the first one expired. src/agent/session.ts: newisEphemeralChannel(channel)classifier.
Persistent allowlist (webchat, voice, discord, telegram, slack, …)
keeps the fullSESSION_TIMEOUT_MS(30 min); everything else gets
EPHEMERAL_TTL_MS(5 min).- LRU cap on ephemeral cache:
EPHEMERAL_MAX_ACTIVE = 100. Beyond that,
oldest-by-lastActiveget evicted. - 7-day idle DB purge in
cleanupStaleSessionsso the store doesn't grow
forever when sessions never get re-messaged. src/gateway/server.ts: cleanup interval shortened 5 min → 60 s so
ephemeral 5 min TTL evicts within ~1 min of expiry.- New
POST /api/sessions/sweependpoint with{channel?, channelPrefix?, idleMs?, force?}body for live operational drain — no service restart.
Default sweep closes every ephemeral;force: trueincludes persistent.
Pre-existing typecheck errors
src/skills/builtin/gepa.ts:awaitin a non-async function — wrapped
daemon registration invoid (async () => { … })().src/skills/builtin/self_improve.ts:SELF_IMPROVE_DIRused at line
20 before itsexport constdeclaration at line 111. Hoisted const to
top, re-exported viaexport { SELF_IMPROVE_DIR }.
Test fixture stale-date trap
tests/integration/smoke.test.ts"Session Listing" idle fixture used
hardcoded2026-04-13dates — past the new 7-day idle purge threshold.
Wrapped invi.useFakeTimers+vi.setSystemTime('2026-04-13T11:00Z')
so the test stays valid as wall-clock time advances. Added
debouncedSave: vi.fn()to thememory/memory.jsmock.
Tests
tests/unit/memory-index.test.ts(NEW, 24): tokenization, ranking,
IDF dampening, idempotent add, removal, vocabulary, performance budget.tests/unit/memory-vector.test.ts(NEW, 5): schema default, embedding-
model default, signature exports.tests/unit/memory-salience-pruning.test.ts(NEW, 10): survival
ordering, recency tiebreak, identity protection, fallback weights.tests/unit/fabrication-guard.test.ts(NEW, 26): all six categories,
multi-finding responses, no false fires on tool-backed claims, third-
person prose ignored,buildNudgeMessageformat.tests/unit/fabrication-verify.test.ts(NEW, 10): existence, empty-
file flagging, lenient compare, hash determinism.tests/unit/session-cleanup.test.ts(NEW, 21): per-channel TTL split,
LRU cap eviction order, sweep filters, 7-day idle purge.tests/unit/subagent-safety.test.ts(NEW, 11): stall/loop detection,
per-tool error wrap, output truncation, graceful degradation.tests/unit/self-improve.test.ts(NEW, 7): checkpoint/restore + rate
limiting.
v5.0.1 — Spacewalk 🚀
🚀 v5.0.1 — Spacewalk
The biggest TITAN release since v1.0. Mission Control becomes a browser-first widget canvas, 110 production-ready widget templates ship out of the box, multi-agent orchestration is hardened, observability is end-to-end, and the agent gains live situational awareness of the canvas it's running in.
Install
npm install -g titan-agent@next
titan onboard
titan gatewayAfter ~1 week of real-world feedback, 5.0.1 promotes from @next → @latest.
Headline features
🪟 Widget gallery — 110 templates across 25 categories
The canvas chat agent always calls gallery_search first. Say "stock tracker for AAPL" → it lands. Say "control my smart lights" → it lands. Say "spawn a sales agent for me" → it lands.
Categories: agents (employees), automation, cooking, creative, data, devops, document, e-commerce, finance, games, health-fitness, homelab, lifestyle, ml-ai, multi-modal, music-dj, productivity, research, smart-home, social, software-builder, travel, utilities, vehicle, web.
New skill widget_gallery exposes gallery_search / gallery_get / gallery_list with scored fuzzy match (trigger phrase=10, name token=4, trigger token=3, tag=2, description=1) and supports both REPLACE_WITH_X and {{X}} placeholder fills with backslash + single-quote + backtick escaping.
🤖 Agent-employees
Receptionist, SDR, Researcher, Coder, Bookkeeper, Data Analyst, Business Control Tower — each is a real TITAN sub-agent panel, not a chatbot persona.
🏠 Smart-home native
Lights, thermostats, scenes, sensors, presence, energy — all controllable from the canvas via Home Assistant.
🛠️ Software builder
App skeletons (React + form + API wrapper), Mini database, Admin panel, Landing page, Blog engine, Shopify-style store — drop in a template, wire it to APIs, ship the same day.
🧠 Self-aware multi-agent
systemPromptPartsassembles bootstrap + per-turn prompts with per-model overlays and aCANVAS_AWARENESSblock.multiAgent.routeMessagethreadssystemPromptAppendixthrough toprocessMessageso the canvas delivers live URL/space/widget context every turn.- New self-awareness modules:
companyPortability,conflictResolver,peerAdvise,runContinuations,subdirHints,trajectory. agentScope.tsnow actually wires config-defined custom agents (was dead code).
📊 End-to-end observability
- PostHog Cloud telemetry (opt-in) with bucketed system fingerprint (no
cpuModel/gpuName;ramGB/gpuVramGBrounded to nearest 4 GB). - Bug-report capture:
~/.titan/bug-reports.jsonl(5 MB rotation, 250 ms burst guard, 4 KB stack truncation) + PostHog forward. - New
POST /api/bug-reports+GET /api/bug-reports/:idendpoints. - Crash-report secret scrubber.
- Diagnostics snapshot, hardware detection, checkpoint subsystem.
🗣️ F5-TTS voice cloning
Replaces Orpheus. mlx-audio on Mac, container on Linux. Faster, cleaner, cross-platform.
🛡️ Hardening
- PII redaction across tool outputs and LLM responses.
- Five-layer secret-exfiltration scanner.
- Pre-execution scanner blocks
rm -rf /,curl | sh,eval, etc. - Shell lifecycle hooks:
pre_tool_call,post_tool_call,on_session_start,on_session_end,on_round_start,on_round_end. - Filesystem checkpoints with snapshot rollback.
🤝 Agent-bus IPC
Cross-agent collaboration channel at ~/.local/bin/agent-bus with file claims, message bus, and Kimi CLI auto-hook for live multi-agent co-working.
Infrastructure
- Node.js >= 22 (bumped from >= 20)
- 37 providers (4 native + 33 OpenAI-compatible)
- 143 skills loaded, 248 tools
- Mission Control v2 React SPA with 25+ admin panels (Vite 6 + Tailwind 4 + React 19)
Why the version number
5.0.0 was published to npm @next on 2026-04-23 as a preview that predated this gallery + canvas situational-awareness work. 5.0.1 is the real Spacewalk release. Same content as v5.0.0 git tag plus the v4.13.0 ancestor-extraction sprint merged in.
Authoring credits
- Tony Elliott — vision, direction, final QA
- Kimi K2.6 (kimi-cli) — bulk-authored ~80% of the widget template gallery, reviewed the gallery skill before commit
- Claude Opus 4.7 (1M context) — gallery skill, canvas chat-agent integration, system prompt assembly, agent-bus IPC, bug-report capture, staged release commit
Migration
Drop-in for v4.13.x. Mission Control URL, default model, and config schema are backward compatible; new fields default-off.
Full changelog: CHANGELOG.md
TITAN v1.0.0 — First Stable Semver Release
TITAN v1.0.0
TITAN goes semver. This is the first stable release under proper semantic versioning, replacing the 2026.10.XX date-based scheme. All prior versions are deprecated.
Install
npm install titan-agent@1.0.0Highlights
- Paperclip Integration — Full agent governance: types, API client, routes, and 14 Command Post UI components
- Provider Error Recovery — Circuit breaker pattern, exponential backoff retry, automatic fallback chain
- Multi-Agent Architecture — Async sub-agent execution via Command Post, inter-agent communication with inbox/wakeup system
- PostgreSQL Storage — Full persistence layer with migrations, JSON fallback, budget/reservation tracking
- CI/CD Pipeline — GitHub Actions with Node 20/22/24 matrix, coverage, Dependabot, Docker GPU builds
- Zero Vulnerabilities — 0 npm audit issues, 0 Dependabot alerts
What's New Since 2026.10.68
Added
- Paperclip integration (types, API client, gateway routes, 14 Command Post UI components)
- Provider error recovery (circuit breaker, exponential backoff, fallback chain)
- Mesh transport routing (next-hop resolution, route broadcast, loop detection)
- Agent wakeup system (heartbeat inbox, async task delegation)
- PostgreSQL storage module (StorageProvider, migrations, JSON fallback)
- Cost estimator and heartbeat scheduler
- External adapters (HTTP, lifecycle, process)
- CI/CD pipeline (GitHub Actions, Node 20/22/24, Docker GPU, Dependabot)
- Docker multi-stage build with GPU support and health checks
- 5 developer example projects
- 124 new smoke tests
- Cloud model bypass for OpenRouter parallel processing
- Mission Control mobile-responsive redesign
Fixed
- 38 TypeScript compilation errors from prior agent commits
- Cloud model tool looping (phase separation)
- Gateway shutdown cleanup
- DeepSeek XML tool parsing
- All npm vulnerabilities (brace-expansion, path-to-regexp)
- All 13 Dependabot alerts (MCP SDK, dompurify, lodash, picomatch, flatted)
Changed
- Versioning migrated from
2026.10.XXto semver1.0.0 - Mandatory QA gate: Coder → QA Tester → CEO + Board approval
- Agent workspace security lockdown (no credentials, shell guards, read-only git configs)
Stats
| Metric | Value |
|---|---|
| Providers | 36 (4 native + 32 OpenAI-compatible) |
| Skills | 100+ loaded |
| Tools | ~195 across 100+ skills |
| Channels | 15 |
| Tests | 4,430+ across 140 files |
| npm vulnerabilities | 0 |
| Dependabot alerts | 0 |
Contributors
Built by Tony Elliott (@Djtony707) with contributions from the Paperclip AI agent team:
- Backend Engineer, Full Stack Engineer, Founding Engineer (core features)
- DevOps Engineer (CI/CD, Docker)
- Frontend Engineer (Mission Control UI)
- Protocol Engineer (mesh transport, inter-agent comms)
- QA Engineer (smoke tests)
- Research & Strategy Analyst (competitive analysis)
- Documentation Engineer, Developer Relations Manager (docs, examples)
Full changelog: CHANGELOG.md
v2026.10.49 — Hindsight MCP Bridge
Hindsight MCP Bridge — Cross-Session Episodic Memory
Added
- Hindsight MCP Bridge (
src/memory/hindsightBridge.ts) — Connects TITAN's learning system to Vectorize.io's Hindsight episodic memoryretainStrategy()— Stores successful tool sequences as "experience" memories after each taskgetHindsightHints()— Queries cross-session memory when local strategy hints don't match- Fully fire-and-forget — never blocks or crashes if Hindsight is unavailable
- 14 new tests covering connection detection, retain, recall, error handling
Stats
- 4,390 tests passing across 138 files
- npm:
titan-agent@2026.10.49
v2026.10.48 — Smart Auto-Learning
Smart Auto-Learning
Added
- SmartCompress Plugin — Task-type-aware context compression via ContextEngine plugin. Classifies conversations by type (coding, research, analysis, general) and applies optimal compression strategies. Configurable aggressiveness.
- Continuous Learning Feedback Loop — Strategy outcome tracking with
recordStrategyOutcome(). Failed strategies auto-excluded from hints. 30-day decay for unvalidated strategies.
Fixed
- Ordered Tool Sequence Capture — Agent loop tracks true execution order with repeats, separate from deduplicated tool set.
- ContextEngine Compact Hook —
runCompact()andrunAfterTurn()now fire in the agent loop. Plugins participate in compression and post-turn learning.
Stats
- 4,376 tests passing across 137 files
- npm:
titan-agent@2026.10.48
v2026.10.47 — Multi-Chip GPU Support
What's New
Multi-Chip GPU Support
- NVIDIA (nvidia-smi), AMD ROCm (rocm-smi), and Apple Silicon (Metal/MPS) GPU detection and monitoring
- Vendor-aware VRAM orchestrator dispatches to correct probe per platform
- Apple Silicon unified memory support (GPU shares system RAM)
system_infoandvram_statustools report vendor-specific GPU details- New config option:
vram.gpuVendor(auto|nvidia|amd|apple|none)
Hindsight MCP Memory Preset
- Builtin MCP preset for Hindsight cross-session episodic memory
- 4-network architecture: world, experience, opinion, observation
- 91% LongMemEval score. Enable via MCP config.
Tool Sequence Learning
- Learning engine now tracks ordered tool call sequences (not just deduplicated sets)
- Task type classification (coding, research, system, creative, general)
- Duplicate sequence merging with success count tracking
- Strategy cap raised 50→200 with smart sorting by success rate + recency
Full Changelog
See CHANGELOG.md for details.
Install: npm install -g titan-agent@2026.10.47
v2026.10.43 — VRAM Orchestrator + NVIDIA GPU Skills
What's New
VRAM Orchestrator (v2026.10.43)
Automatic GPU VRAM management for NVIDIA GPUs (tested on RTX 5090, 32GB).
- nvidia-smi polling — periodic GPU state monitoring (VRAM usage, temp, utilization)
- Model auto-swap — when GPU services need VRAM, the orchestrator downgrades the LLM to a smaller model, then upgrades back when done
- Time-bounded leases — services reserve VRAM with auto-expiry, preventing memory hogging
- Async mutex — all VRAM operations serialized, no race conditions
- Emergency OOM — auto-unloads all models if VRAM drops below critical threshold
- 3 agent tools:
vram_status,vram_acquire,vram_release - 4 API endpoints:
GET /api/vram,POST /api/vram/acquire,POST /api/vram/release,GET /api/vram/check - Config schema:
vram.*section with services budget map, thresholds, auto-upgrade
NVIDIA GPU Skills (v2026.10.42)
- cuOpt — GPU-accelerated vehicle routing optimization via NVIDIA cuOpt v26.02 async API (tested live, VRP solved in 74ms)
- AI-Q Research — Deep research via Nemotron Super 49B NIM API with citation extraction
- OpenShell Sandbox — K3s-based secure code execution with declarative YAML policies
- All gated behind
TITAN_NVIDIA=1env var
Fixes (v2026.10.41-42)
- Voice mic leak — VoiceOverlay cleanup
- Tool visibility —
security.allowedToolsdefault - OpenAI-compat
keepModelPrefixbug - 6 TypeScript type errors
- Voice system prompt rewrite (500 tokens vs 3000+)
Stats
- 4,321 tests across 135 files (all passing)
- 0 TypeScript errors, 0 ESLint errors
- ~155 tools across 100+ skills
v2026.10.39 — Security Release
🔒 Security Release
Resolved all 23 Dependabot vulnerability alerts — TITAN now has 0 known vulnerabilities.
Changes
- Upgraded
matrix-js-sdkv34 → v41 - Added npm overrides for transitive dependencies:
esbuild^0.25.0,yauzl^3.2.1,langsmith^0.5.0 - All 3,879 tests passing across 124 test files
Previous Release (v2026.10.38)
titan doctor --json— Machine-readable JSON output (Issue #2)- Better provider error messages with actionable hints (Issue #3)
- npm download stats in doctor report (Issue #4)
- 27 weather skill tests (Issue #6)
- 5 dependency vulnerability patches
📦 npm install titan-agent@2026.10.39
🤖 Generated with Claude Code