Files
n8n-mcp/src/telemetry/mutation-types.ts
Romuald Członkowski 1bbfaabbc2 fix: add structural hash tracking for workflow mutations (#422)
* feat: add structural hashes and success tracking for workflow mutations

Enables cross-referencing workflow_mutations with telemetry_workflows by adding structural hashes (nodeTypes + connections) alongside existing full hashes.

**Database Changes:**
- Added workflow_structure_hash_before/after columns
- Added is_truly_successful computed column
- Created 3 analytics views: successful_mutations, mutation_training_data, mutations_with_workflow_quality
- Created 2 helper functions: get_mutation_success_rate_by_intent(), get_mutation_crossref_stats()

**Code Changes:**
- Updated mutation-tracker.ts to generate both hash types
- Updated mutation-types.ts with new fields
- Auto-converts to snake_case via existing toSnakeCase() function

**Testing:**
- Added 5 new unit tests for structural hash generation
- All 17 tests passing

**Tooling:**
- Created backfill script to populate hashes for existing 1,499 mutations
- Created comprehensive documentation (STRUCTURAL_HASHES.md)

**Impact:**
- Before: 0% cross-reference match rate
- After: Expected 60-70% match rate (post-backfill)
- Unlocks quality impact analysis, training data curation, and mutation pattern insights

Conceived by Romuald Członkowski - www.aiadvisors.pl/en

* fix: correct test operation types for structural hash tests

Fixed TypeScript errors in mutation-tracker tests by adding required
'updates' parameter to updateNode operations. Used 'as any' for test
operations to maintain backward compatibility while tests are updated.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en

* chore: remove documentation files from tracking

Removed internal documentation files from version control:
- Telemetry implementation docs
- Implementation roadmap
- Disabled tools analysis docs

These files are for internal reference only.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en

* chore: remove telemetry documentation files from tracking

Removed all telemetry analysis and documentation files from root directory.
These files are for internal reference only and should not be in version control.

Files removed:
- TELEMETRY_ANALYSIS*.md
- TELEMETRY_MUTATION_SPEC.md
- TELEMETRY_*_DATASET.md
- VALIDATION_ANALYSIS*.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en

* chore: bump version to 2.22.18 and update CHANGELOG

Version 2.22.18 adds structural hash tracking for workflow mutations,
enabling cross-referencing with workflow quality data and automated
success detection.

Key changes:
- Added workflowStructureHashBefore/After fields
- Added isTrulySuccessful computed field
- Enhanced mutation tracking with structural hashes
- All tests passing (17/17)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en

* chore: remove migration and documentation files from PR

Removed internal database migration files and documentation from
version control:
- docs/migrations/
- docs/telemetry/

Updated CHANGELOG to remove database migration references.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
2025-11-14 13:57:54 +01:00

161 lines
4.0 KiB
TypeScript

/**
* Types and interfaces for workflow mutation tracking
* Purpose: Track workflow transformations to improve partial updates tooling
*/
import { DiffOperation } from '../types/workflow-diff.js';
/**
* Intent classification for workflow mutations
*/
export enum IntentClassification {
ADD_FUNCTIONALITY = 'add_functionality',
MODIFY_CONFIGURATION = 'modify_configuration',
REWIRE_LOGIC = 'rewire_logic',
FIX_VALIDATION = 'fix_validation',
CLEANUP = 'cleanup',
UNKNOWN = 'unknown',
}
/**
* Tool names that perform workflow mutations
*/
export enum MutationToolName {
UPDATE_PARTIAL = 'n8n_update_partial_workflow',
UPDATE_FULL = 'n8n_update_full_workflow',
}
/**
* Validation result structure
*/
export interface ValidationResult {
valid: boolean;
errors: Array<{
type: string;
message: string;
severity?: string;
location?: string;
}>;
warnings?: Array<{
type: string;
message: string;
}>;
}
/**
* Change metrics calculated from workflow mutation
*/
export interface MutationChangeMetrics {
nodesAdded: number;
nodesRemoved: number;
nodesModified: number;
connectionsAdded: number;
connectionsRemoved: number;
propertiesChanged: number;
}
/**
* Validation improvement metrics
*/
export interface MutationValidationMetrics {
validationImproved: boolean | null;
errorsResolved: number;
errorsIntroduced: number;
}
/**
* Input data for tracking a workflow mutation
*/
export interface WorkflowMutationData {
sessionId: string;
toolName: MutationToolName;
userIntent: string;
operations: DiffOperation[];
workflowBefore: any;
workflowAfter: any;
validationBefore?: ValidationResult;
validationAfter?: ValidationResult;
mutationSuccess: boolean;
mutationError?: string;
durationMs: number;
}
/**
* Complete mutation record for database storage
*/
export interface WorkflowMutationRecord {
id?: string;
userId: string;
sessionId: string;
workflowBefore: any;
workflowAfter: any;
workflowHashBefore: string;
workflowHashAfter: string;
/** Structural hash (nodeTypes + connections) for cross-referencing with telemetry_workflows */
workflowStructureHashBefore?: string;
/** Structural hash (nodeTypes + connections) for cross-referencing with telemetry_workflows */
workflowStructureHashAfter?: string;
/** Computed field: true if mutation executed successfully, improved validation, and has known intent */
isTrulySuccessful?: boolean;
userIntent: string;
intentClassification: IntentClassification;
toolName: MutationToolName;
operations: DiffOperation[];
operationCount: number;
operationTypes: string[];
validationBefore?: ValidationResult;
validationAfter?: ValidationResult;
validationImproved: boolean | null;
errorsResolved: number;
errorsIntroduced: number;
nodesAdded: number;
nodesRemoved: number;
nodesModified: number;
connectionsAdded: number;
connectionsRemoved: number;
propertiesChanged: number;
mutationSuccess: boolean;
mutationError?: string;
durationMs: number;
createdAt?: Date;
}
/**
* Options for mutation tracking
*/
export interface MutationTrackingOptions {
/** Whether to track this mutation (default: true) */
enabled?: boolean;
/** Maximum workflow size in KB to track (default: 500) */
maxWorkflowSizeKb?: number;
/** Whether to validate data quality before tracking (default: true) */
validateQuality?: boolean;
/** Whether to sanitize workflows for PII (default: true) */
sanitize?: boolean;
}
/**
* Mutation tracking statistics for monitoring
*/
export interface MutationTrackingStats {
totalMutationsTracked: number;
successfulMutations: number;
failedMutations: number;
mutationsWithValidationImprovement: number;
averageDurationMs: number;
intentClassificationBreakdown: Record<IntentClassification, number>;
operationTypeBreakdown: Record<string, number>;
}
/**
* Data quality validation result
*/
export interface MutationDataQualityResult {
valid: boolean;
errors: string[];
warnings: string[];
}