Releases: Git-Rocky-Stack/Team-X
v3.2.1
Full Changelog: v3.2.0...v3.2.1
v3.2.0
Full Changelog: v3.1.0...v3.2.0
v3.1.0 — Agentic Prompt-Engineering Audit P1 Closure
Minor release closing nine P1 findings from the 2026-05-07 agentic-system prompt-engineering audit (H6 through H14) plus an orchestrator run-agent hardening pass. Every change is backward-compatible — new fields and deps are optional, pre-H callers unchanged.
Added
- H6 — Typed event payloads + runtime guards in
@team-x/shared-types/events. Consumers can now discriminate bykindwith full type narrowing instead of casting throughunknown. - H7 — Per-employee monthly token caps in
budget-governance-service. Set-backed scope membership makes cap evaluation O(1) per check instead of scanning the assignment list each turn. - H10 —
work.failedpayload schema inagentic-loop-service. Every failure now carriesthreadId/employeeId/messageIdso downstream audit, telemetry, and the self-improvement loop can attribute the failure without re-querying. - H13 — Copilot insight severity ceiling in
copilot-analyzer-service.MAX_CRITICAL_DRAFTS_PER_TICK = 2plus a pureapplyCriticalCeilinghelper bounds the critical-alert surface: overflow drafts get downgraded towarning(signal preserved, alert fatigue bounded). NewcriticalProposed/criticalDowngradedtelemetry counters, zero-init on every early-exit path. +11 tests (7 helper + 4 service integration). - H14 — Copilot category-weight feedback loop closure. New pure
aggregateCategoryWeightsFromDismissalshelper produces a complete updated weights map plus an audit trail of changed categories. New opt-inautoApplyDismissalFeedbacktoggle: when ON, the loop persists weights viasetCopilotWeights, emitscopilot.weights.changedwithactorKind='employee'/actorId='system-copilot', and returnsfeedbackAppliedinstead of the advisoryfeedbackSuggestion. Defensive fallbacks — missing setter, setter-throws, and empty aggregation all degrade to the advisory path withconsole.warn. +13 tests (6 aggregator + 5 auto-apply integration + 2 advisory pins).
Changed
- H8 — Retrieval orchestrator dedup-by-
refplus a freshness-bias scoring term so identical citations collapse and recent context outranks stale matches at equal cosine distance. - H9 — Intelligence loop uses bounded exponential backoff with a
max-attemptsguard so a flapping downstream can never spin the loop indefinitely. - H11 — Agentic tools enforce a tool-result size cap on the default chat path. Runaway tool responses return a truncation marker instead of unbounded text.
- H12 — Agent-improvement service dedupes by causation-chain root and adds a recursion-via-DB block so self-improvement runs cannot chain into themselves through the events table.
- Orchestrator
run-agenthardening (apps/desktop/src/main/orchestrator/run-agent.ts). Companion tests expanded by ~318 lines inrun-agent.test.ts. - Release-marker freeze pinned to 3.1.0 across all 7 workspace
package.jsonfiles. Test guard intop-bar.test.tsxupdated in lock-step. - Documentation URL canonicalization — README, CONTRIBUTING, getting-started docs, the static landing site, and the
strategia-officialrole-pack now point atgithub.com/Git-Rocky-Stack/Team-X. Clone-and-cdsnippets corrected tocd Team-Xfor case-sensitive filesystems.
Fixed
- Per H10, work-failure events that previously surfaced without
threadIdare now always attributed to their originating thread. - Per H13, ticks that previously produced an unbounded number of
severity: criticalinsights are now capped at 2 per tick with the surplus downgraded rather than dropped.
Verification
Audit doc: docs/audits/2026-05-07-agentic-system-prompt-engineering-audit.md — all H6-H14 entries marked Resolved.
| Workspace | Tests |
|---|---|
@team-x/desktop |
2141/2141 (1 pre-existing keytar native-ABI fail, not H-attributable) |
@team-x/intelligence |
210/210 |
@team-x/shared-types |
74/74 |
| Net new across H6-H14 | +24 |
Typecheck clean across all four tsconfig projects.
Audit trail: every H<n> finding ships with implementation + a dedicated describe block in tests (string audit 2026-05-07 is greppable) + audit-doc resolution entry. See CHANGELOG.md [3.1.0] for the full per-finding breakdown.
v3.0.0 — Agentic System Enhancement · Settings UX Repairs · System-Employee Top-Up
Major release in two halves: a four-fix sweep across Settings + system bootstrap that
restores user-visible features Rocky filed as broken (copilot.ask error for pre-M33
companies, dead proactive-mode toggle, missing Skill / MCP install entry points,
no way to delete old backups), and a three-track agentic-system enhancement that
replaces three load-bearing stubs with their real implementations (Enhanced AI's
LLM provider, workload-aware delegation signals, the /promote natural-language
command). The composition root for the main process now wires every authored
service that was sitting on the shelf — verified by a comprehensive
authored-vs-wired audit across 119 service files and ~290 IPC channels.
Tests 2051/2053 passing (every targeted suite green; the two pre-existing
failures are a keytar native-ABI mismatch and a release-marker drift now
resolved by this bump). Typecheck clean across all four tsconfig projects.
Added
- Authority Snapshot install entry points
(apps/desktop/src/renderer/src/features/settings/extensions-section.tsx).
Two new buttons —Add SkillandAdd MCP— surface in the card header.
Each opens the existingInstallSkillDialog/ImportMcpDialog, both of
which had shipped fully-working but were not exposed from the new Settings
page (the previous shell had a banner explaining marketplace installs were
removed "until the replacement flow can be engineered without risking the
whole page" — this is that replacement). CLI extensions deferred pending
the agentic system design pass;EXTENSION_KINDSremains['skill', 'mcp'].
Test guard flipped fromnot.toContain('InstallSkillDialog')to
toContainwith the right wiring shape (extensions-section.test.tsx:89-115). - Backup delete IPC + UX
(apps/desktop/src/main/services/backup.ts,
packages/shared-types/src/ipc.ts,
apps/desktop/src/main/ipc/handlers.ts,
apps/desktop/src/main/ipc/register.ts,
apps/desktop/src/preload/api.ts,
apps/desktop/src/renderer/src/hooks/use-backup.ts,
apps/desktop/src/renderer/src/features/settings/backup-section.tsx).
Full-stack add: servicedelete(backupPath)method with a path-traversal
safety guard (path.relativefrombackupsDirrejects..traversal,
absolute paths on different drives, the jail itself, and empty strings),
BackupDeleteRequest/BackupDeleteResponseshared types,backup.delete
channel registered alongsidebackup.create/backup.restore/backup.list,
preload method,useDeleteBackuphook with['backups']cache invalidation,
and aTrash2icon button per row in the BackupSection with a confirm
flow that's mutually exclusive with the existing Restore confirm. Six new
unit tests cover the happy path, idempotent missing-path delete, four
traversal-guard cases (backup.test.ts:188-243). - Boot-time system-employee top-up
(apps/desktop/src/main/index.ts:1437-1470).
The per-company boot loop now idempotently runsensureSystemAgent+
ensureSystemCopilotfor every live company. Pre-M33 companies — created
via M31 paths beforeensureSystemCopilotlanded — now get their missing
system-copilotrow on first boot after the upgrade. Without this top-up,
copilot.askthrew[copilot-service] No system-copilot employee for company "<id>". Did ensureSystemCopilot run on company creation?for any
company that predated M33. Errors per-company are logged + swallowed so a
single broken company can't block boot for the rest. New regression test
system-agent-bootstrap.test.tssimulates the pre-M33 state (agent row
exists, copilot row missing) and asserts the agent row stays untouched
while the copilot row gets created.
Changed
- Enhanced AI now uses the real LLM provider
(apps/desktop/src/main/index.ts:1189-1248).
The M32 placeholderllmCompletethat returned the literal string
(LLM response not configured)regardless of input is gone. Replaced with
an adapter that resolves the first live company'ssystem-agent, threads
it through the sameresolveProviderclosure the agentic loop and copilot
analyzer use (test-mode → canned; production → runtime profile + secrets),
and accumulatesstreamAgentdeltas into a single text blob — same shape
theWriteSideCompleteFnadapter uses at line ~1862. All 7enhancedAi.*
IPC channels (enhancedAi.stats,enhancedAi.query,
enhancedAi.indexWithSemanticChunking,enhancedAi.extractAndStoreFacts,
enhancedAi.queryKnowledge,enhancedAi.createPlan,enhancedAi.getStats)
now return real LLM output when the user has configured a provider. Test-mode
and unconfigured-mode paths unchanged (still gated by
llmEnabled && ragService !== null). - Workload-aware delegation has real signals
(apps/desktop/src/main/index.ts:1810-1859).
WriteSideWorkloadProvider.inMeeting(employeeId)now reads the active
meeting viameetingsRepo.getActive(companyId), parsesattendeesJson,
and tests membership — replacing the() => falsestub that always told
the planner every employee was available.
avgCompletionMs(employeeId, _subtaskType)aggregatesclosedAt - createdAt
across all closed tickets the candidate was the assignee on (clamped against
the 48-hourpastPerformanceCeilingMsdefault). Returnsnullfor new
hires so they're not penalized (preserves the planner's neutral 0.5
default). Subtask-type filtering is forward-compat: parameter accepted,
ignored in V1 — ticket labels do not yet carry a subtask-type taxonomy.
Both implementations wrap intry/catch→ conservative defaults
(false/null) on repo errors. Result:decompose_projectand
delegate_subtasktools score candidates with real load + history instead
of always-available + no-history. /promoteworks in the command palette
(apps/desktop/src/main/index.ts:2329-2342,
apps/desktop/src/main/services/command-service.ts).
The CommandService dispatcher'semployeesPromoteslot was unwired despite
the IPC handler shipping in M-C step d (employees.promoteregistered at
register.ts:687, exercised byemployees-promote-handlers.test.ts).
Result: typingpromote Alice to CTOin the palette returned
handler_error. Now wired with a shape adapter — classifier emits
{employeeId, roleId, newLevel}, IPC takes{employeeId, newRoleId},
newLevelis discarded because the IPC handler derives the level from
the role spec (single source of truth, no divergence risk).- Release-marker freeze pinned to 3.0.0
(apps/desktop/src/renderer/src/app/top-bar.test.tsx:44-47).
APP_RELEASE_VERSION,PACKAGE_RELEASE_VERSION,SHARED_TYPES_RELEASE_VERSION,
INTELLIGENCE_RELEASE_VERSIONall unified at3.0.0. Resolves the v2.0.10-era
drift whereAPP_RELEASE_VERSIONwas still'2.0.9'after the workspace
shipped at2.0.10.
Fixed
- Proactive mode toggle no longer snap-backs
(apps/desktop/src/main/index.ts:1994-2078).
ProactiveTriggerServicewas authored at
apps/desktop/src/main/services/proactive-trigger-service.ts, referenced
by 4 IPC handlers (proactive.setEnabled,proactive.decomposeGoal,
proactive.scanForWork,proactive.getState), and never instantiated
in the composition root. Everyproactive.*IPC fell through to
throw new Error('[ipc] proactive.<method>: proactiveTriggerService dep is required'). The renderer's optimistic Switch caught the throw and
reverted to OFF on every flip. Fix:createProactiveTriggerService(...)
is now instantiated right aftercreateAgenticLoopService, and the IPC
handler deps include a lazy-resolver wrapper (matches the existing
copilotAnalyzerServicepattern at line 1364) so the trigger service
can come online aftercreateIpcHandlersis composed. The wrapper closes
over a module-levelproactiveTriggerServiceInstance: ProactiveTriggerService | null
declared next toagenticLoopServiceInstance.
Audited (no changes)
- Authored-vs-wired audit across 119 service files in
apps/desktop/src/main/services/, ~290 IPC channels in
register.tsREQUEST_CHANNELS /handlers.tsIpcHandlers /shared-types
ChannelMap, and 20+ optional handler deps. Confirmed the
ProactiveTriggerServicegap was the only fully-unwired service.
Other findings (workload-signal stubs, Enhanced AI LLM stub, missing
/promotedispatcher entry) are addressed by this release; remaining
intentional deferments (classifiercompletestub atindex.ts:1467,
thecompanies.archiveclear hookup forcopilotEventWindow.clear—
which IS wired despite a stale comment at line 1227) are documented and
unchanged. No drift in registry consistency: every channel in
REQUEST_CHANNELS has a matchingipcMain.handleregistration; every
IpcHandlersmethod has a matching channel; every ChannelMap entry has
a backing handler.
v2.0.10 — Typography Cascade · Orchestrator Retry · Settings UX
Three-part release: a workspace-wide typography master format that
collapses ~1,500 ad-hoc text-*/tracking-* classes onto 20 semantic
tokens, a transparent retry path in the orchestrator that absorbs
transient fetch failed flakes against the local Ollama daemon, and
five surgical Settings UX fixes covering broken switches, invisible
checkboxes, and a chooser whose Button wrapper was outranking the
.brand-selected primitive. Tests 1978/1978 passing (up from 1959
— +18 new for orchestrator retry + +1 for proactive persistence
regression). Typecheck clean across all four tsconfig projects.
Added
- Orchestrator transient-fetch retry (
apps/desktop/src/main/orchestrator/).
Newtransient-errors.tsmodule classifies undiciTypeError("fetch failed"),ECONNRESET,ECONNREFUSED,ETIMEDOUT, and the undici
UND_ERR_*codes by walking up to 5 levels oferror.cause. The
predicate short-circuits onAbortErrorso user-cancelled runs never
hit the retry path.runAgentnow wraps the stream-draining block in
a 2-attempt loop (1 initial + 1 retry, 200 ms backoff) that fires
only when zero chunks have streamed — preventing duplicated
output to an open message bubble. When retries exhaust, the
user-visible error becomes"Provider connection dropped. Please retry, or switch to a different provider in Settings."with the
original error preserved onError.causefor forensics. Repro:
threefetch failedruns in the user's runs table — all <150 ms,
all isolated incidents during otherwise-successful sessions against
ollama-local + gemma4:31b-cloud— would each have been absorbed. - 18 new orchestrator tests — 12
transient-errors.test.ts(positive
matches: bare TypeError, surrounding whitespace, cause-chain depth 1+2,
undici codes, ETIMEDOUT; negatives: AbortError, named AbortError,
HTTP-status errors, unrelated errors, non-Error throws,
self-referential cause loop) plus 6run-agent.test.tsretry-path
cases (success-after-retry without event duplication, exhausted
retries with friendly message, no-retry-after-chunks-streamed,
no-retry-on-HTTP-status, no-retry-on-pre-aborted-signal, original
error preserved ascause).
Changed
- Typography master-format cascade.
tailwind.config.tsgains 13
theme.extend.fontSizesemantic tokens generatingtext-display,
text-h1–text-h4,text-body,text-body-strong,text-body-sm,
text-caption,text-label,text-button,text-button-sm, and
text-menu-item— each tuple specifying size + line height +
letter-spacing + font weight together.globals.cssadds 8 component
utilities:.text-eyebrow(11 px uppercase 0.18em),
.text-eyebrow-sm,.text-menu-label,.text-shortcut,.text-code
(13 px mono),.text-code-sm,.text-numeric(24 px tabular-nums),
.text-numeric-lg(32 px). Twelve shadcn primitives refactored to
consume the new tokens at the bottom of the cascade —Buttonnow
usestext-button,CardTitletext-h3,CardDescription
text-body-sm,Dialog/Sheettitlestext-h3,DropdownMenuItem
text-menu-item,Input/Textareadrop the responsive
md:text-smjump in favour oftext-body,Labeltext-label leading-none,TabsTriggertext-button-sm,AlertTitle
text-h4,AlertDescriptiontext-body-sm,
SelectTrigger/SelectLabel/SelectItem, andBadge
text-caption font-semibold. Top-of-cascade shells (top-bar.tsx,
sidenav.tsx,mission-shell.tsx,mission-control-dashboard.tsx,
settings-view.tsx,audit-view.tsx,extensions-section.tsx,
permissions-section.tsx, plus ~90 feature files) consolidated to
the canonical token set. Net effect: 9 different "eyebrow" recipes
collapsed to onetext-eyebrowtoken; 6 differenttracking-*
patterns baked into the per-token definitions; broken hierarchy
fixed (Settings page heading was 14 px / same size as buttons —
now correctlytext-h1at 28 px).
Fixed
- Enhanced AI Settings — 7 hand-rolled toggles invisible in dark mode
(enhanced-ai-section.tsx). The off-state usedbg-surface-100for
the track andbg-backgroundfor the thumb; both resolve to
near-black in AMOLED, rendering as a featureless black blob.
Replaced all seven (Query Expansion, Semantic Chunking, Long-Term
Memory, Knowledge Graph, Multi-Turn Planning, Streaming Responses,
Distributed Tracing) with the canonical<Switch>primitive, which
usesbg-input(HSL 0 0% 14.9%) for a visible mid-gray track
matching the rest of the app. Multi-Turn Planning and Distributed
Tracing keepclassName="mt-5"to preserve title-text alignment in
theiritems-startrows. Dropped the now-unusedhandleToggle
helper. - Active Authority Grants permission labels lower-case
(extensions-section.tsx,permissions-section.tsx). Permission
badges rendered the raw'allow' | 'deny' | 'prompt'enum values.
Added typedPERMISSION_LABEL: Record<AuthorityPermission, string>
in extensions-section (TypeScript exhaustiveness for free) and a
formatPermission(permission: string): stringhelper in
permissions-section (respecting that file's no-shared-types import
rule). Both badges now renderAllow,Deny,Prompt. - Copilot Allowed Categories checkboxes rendering browser-blue
(copilot-section.tsx). Native<input type="checkbox">was
inheriting Chromium's default check colour. Addedaccent-brand
(the same canonical pattern already incall-meeting-dialog.tsx),
which maps the CSSaccent-colorproperty to the registered
brand: '#AA2024'token. - Proactive Mode toggle didn't persist (
handlers.ts,
proactive-handlers.test.ts). The IPC handler called
proactiveTriggerService.setEnabledwhich only mutated an in-memory
per-companydisabledCompaniesSet; the renderer's getter read
proactive_enabledfrom the SQLite settings table which stayed
false. After the optimistic switch flipped, react-query
invalidation refetched the unchanged DB value and the
useEffect/optimistic reset snapped the thumb back. Fix: handler
now persists viasettingsRepo.setProactive({ enabled })first,
then forwards to the trigger service. Both sources of truth move
together; on a subsequent load the global gateisEnabled()
(settings.enabled AND NOT disabledCompanies.has(companyId)) finally
returnstrue. New regression test asserts bothsetProactivecalls
fire (ON and OFF) for the toggle UX. - Autonomy Policy chooser only showed a thin red ring
(extensions-section.tsx). Wrapping<Button variant="outline">
applied utilitiesborder-input(mid-gray) andbg-background
(black). Tailwind's layer order isbase < components < utilities,
so those utilities outranked.brand-selected's component-layer
border-color and background-color rules — only the box-shadow
(whichButtondoesn't set) made it through, leaving a lonely 1 px
inset red ring on a black box with a gray border. Replaced with a
plain<button>matching the Runtime Strategy chooser pattern
verbatim. The selected state now shows the full thicker red bezel,
translucent red fill, and 12 px outer red glow that
.brand-selectedwas always meant to deliver.