A mature-host BUY case: new value is concentrated in execution evidence and bounded failure domains, not replacement security infrastructure.
In 60 seconds
Technical verdict: BUY, with the ordinary purchase/grant gate before licensed source is committed. The report rejects n8n's already-mature breaker, SSRF, encryption, API-key, evaluation, supply-chain and AI-credit capabilities.
Tamper-evident per-execution evidence, incident replay and portable attestation over the existing event bus.
Composite #1 → packages/cli/src/eventbus/**
Bulkhead + retry budget + jittered retry for n8n-owned dependencies; does not rewrite arbitrary user workflow calls.
Composite #2 → ai-service-retry.ts; external-secrets retry manager
Adds deterministic cause edges across workflow/node/queue/runner evidence and protects the recorded chain.
Composite #3 → event-message-classes/**
Security-shaped request fixtures become deterministic replay regressions around body parsing, SSRF and endpoint limiting.
Composite #4 → request-boundary tests
Host-first freeze SHA-256: 095b03874c95acd1e7dafead37e1f502a03070da4cf0ca9493aafdc375834cfe. Licence gate: EVALUATE ONLY until a purchase/grant record exists.
Step 0
Run before any integration. n8n’s source-visible product shape is compatible with the authoritative embedded-product grant; the current blocker is only the absent purchase/grant record.
| Field | Result |
|---|---|
| Host licence (SPDX) | LicenseRef-n8n-sustainable-use for ordinary source; separate n8n Enterprise License for .ee. source. |
| Where it was found | LICENSE.md; LICENSE_EE.md; package.json license fields. |
| Purchase or grant record | None found; EVALUATE ONLY. |
| Licence | CMPSBL Perpetual Edition 1.0; US$499 once, perpetual, per company; no source-disclosure obligation. |
| Verdict | EVALUATE ONLY now because no purchase/grant record exists. Technical BUY after purchase; n8n is a substantial independent product and therefore fits the embedded-product grant. |
| Clause that drove it | AGENTS.md Step 0 “No purchase or grant record” rule. CMPSBL LICENSE §§1.1(c)–1.3 permit embedding in a substantial product; §§2.1–2.2 block redistribution of the Library itself. |
| Scope limits imposed | Catalog-only evaluation. No CMPSBL source copied/wired; only final two report files may be added. |
Sub-package scan: 69 n8n-sustainable-use workspaces, 15 MIT, 2 ISC, 1 Apache-2.0. Recommended attachment points avoid the permissively published workspaces.
Verdict
Capability acquisition clears the price.
n8n is mature enough that most obvious catalog matches are rejected. The credible retained value is tamper-evident execution evidence, forensic/causal incident reconstruction, and bounded failure domains around n8n-owned external dependencies.
Important unresolved gap: the catalog's rate-limiters do not expose a shared-state/store port, so this report does not claim they solve n8n multi-main limiter state.
Step 5A — the section that sells
Four host-specific capabilities that exist only when catalog parts are combined with n8n.
COMPOSITE #1 — Execution Evidence Capsule
Composition: CMPSBL BLD-ENG-009 "Tamper-Evident Chain" (createAuditChain) + CMPSBL BLD-ENG-105 "Forensic Replay" (AuditEvent, ReplaySession, ReplayResult, ForensicReplayEngine) + CMPSBL STIER-S-81 "Compliance Attestation Generator" (EvidenceItem, Attestation, generateAttestation, batchAttest) + host packages/cli/src/eventbus/**
Problem: packages/cli/src/eventbus/message-event-bus-writer/message-event-bus-log-writer-worker.ts:89 appends JSON lines directly; no cryptographic event-chain linkage was found in the observed event-bus implementation. Supply-chain attestations do not prove what an individual workflow execution did.
Behaviour: Selected execution/audit events are canonicalized into an append-only hash chain, sliced into a read-only incident replay, and emitted as an evidence attestation. Existing event delivery and execution storage remain authoritative.
New because: The chain alone only detects history alteration; replay alone only reconstructs; attestation alone only packages evidence. Together with n8n's existing event stream they create a per-execution evidence capsule that neither side has by itself.
Attachment: packages/cli/src/eventbus/message-event-bus-writer/** + event-message-classes/**; optional read-only execution/report endpoint later
Untouched: Workflow execution semantics, event-bus destinations, Sentry/error reporting, SBOM/VEX pipeline and existing database execution records.
Effort: ~3–6 engineer-days (basis: 67 + 103 + 57 entry LOC, canonicalization/hash/replay/attestation concerns, persistence and endpoint tests).
Verified: C:ok I:ok B:— T:— S:scan
Data path: execution/audit event -> canonical evidence -> hash chain -> incident slice -> attestation
| | |
+---- existing event bus/database ----+COMPOSITE #2 — Provider Failure Cell
Composition: CMPSBL SUBP-06 "BULKHEAD" + CMPSBL BLD-ENG-266 "Retry Budget" + CMPSBL BLD-ENG-303 "retry-with-backoff" + host retryability classifier / AI service retry / external-secrets retry paths
Problem: packages/cli/src/utils/ai-service-retry.ts:27-29 explicitly says the timed-out underlying SDK request cannot be aborted; packages/cli/src/modules/external-secrets.ee/retry-manager.service.ts:62-91 recursively schedules retries with increasing attempt count and no observed attempt ceiling. No generic per-dependency concurrency compartment was found in the observed outbound transport.
Behaviour: For n8n-owned external dependencies only, each provider gets a bounded concurrency compartment; retries use jitter and a refilling retry budget so failures cannot multiply work without bound. Domain-specific retryability classification remains host-owned.
New because: Backoff controls timing, the retry budget controls aggregate retry pressure, and the bulkhead controls concurrent occupancy. Only the composition turns one flaky dependency into a bounded failure domain.
Attachment: packages/cli/src/utils/ai-service-retry.ts; packages/cli/src/modules/external-secrets.ee/retry-manager.service.ts; selected internal outbound call sites
Untouched: User-selected workflow providers, generic HTTP Request node semantics, existing SSRF checks, existing circuit breaker, Redis queueing and workflow retryOnFail contract.
Effort: ~3–6 engineer-days (basis: 539 + 56 + 55 entry LOC, dependency partitioning, queue/reject policy, retry budget, jitter, metrics and parity tests).
Verified: C:ok I:ok B:— T:— S:scan
Data path: n8n-owned call -> dependency bulkhead -> retryability -> budgeted jittered retry -> existing transport
| |
+-- saturation ----+--> shed/surfaceCOMPOSITE #3 — Causal Run Ledger
Composition: CMPSBL BLD-ENG-034 "Causal Event Propagation" + CMPSBL BLD-ENG-009 "Tamper-Evident Chain" + host AbstractEventMessage / workflow / node / execution / queue / runner events
Problem: packages/cli/src/eventbus/event-message-classes/abstract-event-message.ts:84-92 defines id, timestamp, event name, message and payload but no explicit parent/causal field. Chronology alone can be ambiguous across queue, runner and node boundaries.
Behaviour: Deterministic relationships add parent/causal edges to selected events; the resulting chain is hash-linked so an incident view can answer not only what happened next, but what caused what.
New because: Causal propagation creates the graph, while the tamper chain protects the graph's recorded history. n8n supplies the real execution events that make the generic primitives useful.
Attachment: packages/cli/src/eventbus/event-message-classes/** and the event emission adapters where executionId/node/run relationships are already known
Untouched: Existing event ids, payload contracts for destinations, workflow scheduler/executor and database records.
Effort: ~2–4 engineer-days (basis: 106 + 67 entry LOC, relationship mapping, canonical hashing and destination-compatibility tests).
Verified: C:ok I:ok B:— T:— S:scan
Data path: workflow -> node -> queue -> runner events
| | |
+---- causal edges ----> hash-linked run ledgerCOMPOSITE #4 — Boundary Regression Replay Pack Composition: CMPSBL BLD-ENG-248 "Adversarial Input Generator" + CMPSBL BLD-ENG-105 "Forensic Replay" + host body-parser / SSRF / endpoint-rate-limit test harnesses Problem: packages/cli/src/middlewares/__tests__/body-parser.test.ts:16-58 and packages/@n8n/backend-network/src/ssrf/__tests__/ssrf-protection.service.test.ts:53-110 show strong boundary-specific tests, while packages/cli/src/services/rate-limit.service.ts:31-74 defines another security boundary; no shared repository-wide adversarial corpus was found across them. Behaviour: Generates deterministic security-boundary fixtures, captures the exact observed result, and promotes any interesting failure into a replayable regression case. Production request handling is not changed. New because: A finite adversarial catalog becomes operationally valuable only when a failure can be captured and replayed through n8n's real parsers/guards. Attachment: tests around packages/cli/src/middlewares/body-parser.ts, packages/@n8n/backend-network/src/ssrf/ssrf-protection.service.ts and packages/cli/src/services/rate-limit.service.ts Untouched: Production parsers, SSRF allow/block rules, limiter thresholds and user workflow semantics. Effort: ~2–4 engineer-days (basis: 33 + 103 entry LOC, adapter/corpus/result-normalization/replay concerns and CI fixture wiring). Verified: C:ok I:ok B:— T:— S:scan Data path: adversarial corpus -> existing boundary under test -> captured result -> forensic replay regression
| Composite | Ingredients | New behaviour | Effort |
|---|---|---|---|
| Execution Evidence Capsule | BLD-ENG-009 + BLD-ENG-105 + STIER-S-81 + n8n event bus | Tamper-evident per-execution evidence + read-only forensic slice + attestation | ~3–6 engineer-days |
| Provider Failure Cell | SUBP-06 + BLD-ENG-266 + BLD-ENG-303 + n8n retryability/retry paths | Per-dependency concurrency compartment + aggregate retry-pressure budget + jittered retry | ~3–6 engineer-days |
| Causal Run Ledger | BLD-ENG-034 + BLD-ENG-009 + n8n event families | Deterministic cause edges protected by a tamper-evident run history | ~2–4 engineer-days |
| Boundary Regression Replay Pack | BLD-ENG-248 + BLD-ENG-105 + n8n boundary tests | Shared adversarial corpus whose interesting failures become deterministic replay regressions | ~2–4 engineer-days |
Build this composite first: Execution Evidence Capsule. It adds a new evidence property without changing workflow execution semantics.
Step 5B — new single-component designs
Five concrete product/engineering designs derived from the retained rows and host evidence.
DESIGN #1 — Enterprise Execution Receipt Built from: CMPSBL BLD-ENG-009 "Tamper-Evident Chain" (createAuditChain) + CMPSBL STIER-S-81 "Compliance Attestation Generator" (EvidenceItem, Attestation, generateAttestation, batchAttest) Plus host: packages/cli/src/eventbus/** execution/audit events and existing execution identifiers What it is: A read-only receipt for a workflow execution containing selected event evidence, chain verification status and a portable attestation payload. New because: n8n stores executions and emits events; the library adds tamper-evident packaging rather than another execution store. Unlocks: Enterprise incident handoff, support evidence, audit export and a stronger trust story without claiming compliance certification. Evidence path: executionId -> selected EventMessage records -> canonical evidence -> createAuditChain -> generateAttestation -> receipt/report Effort: ~3–5 engineer-days (basis: 67 + 57 entry LOC + host event schema/endpoint/tests). Constraints: BLD-ENG-009 Verified: C:ok I:ok B:exec T:— S:scan; mode: direct; ports: none stated. STIER-S-81 Verified: C:ok I:ok B:load T:— S:scan; mode: direct; ports: none stated. T:— = Not claimed. S:scan is the author's self-scan, not an independent audit. Purchase/grant + attribution required before integration. Confidence: high — host evidence seam is explicit and TypeScript-direct, but source review is still required post-purchase.
DESIGN #2 — Provider Isolation Profile Built from: CMPSBL SUBP-06 "BULKHEAD" (BulkheadOptions, BulkheadRunOptions, Bulkhead, createBulkhead, BulkheadSubject, bulkheadContract, BulkheadRejection, BulkheadPolicy, RejectionReason +1 more) Plus host: packages/@n8n/backend-network/src/http/retryability.ts; packages/@n8n/backend-network/src/http/undici/transport.ts; n8n-owned dependency names What it is: A small registry that assigns concurrency/queue/reject policy per internal dependency, deliberately excluding arbitrary user HTTP destinations at first. New because: n8n has circuit breaking and retry classification but no generic per-dependency bulkhead was found in the observed transport. Unlocks: One hung provider cannot occupy the whole process; saturation becomes explicit and measurable. Evidence path: dependency key -> createBulkhead -> existing call -> state snapshot/telemetry Effort: ~2–4 engineer-days integration (basis: 539 entry LOC + host keying/policy/telemetry tests; acquisition-equivalent size is in the kit's 1–3 engineer-week band). Constraints: SUBP-06 Verified: C:ok I:ok B:load T:— S:scan; mode: direct; ports: none stated; constraints: none. T:— = Not claimed. Queue/reject behavior must be introduced behind flags and measured. Confidence: high for n8n-owned dependencies; low for generic workflow traffic until semantics are proven.
DESIGN #3 — Retry Policy Registry Built from: CMPSBL BLD-ENG-303 "retry-with-backoff" (RetryOptions, retry) + CMPSBL BLD-ENG-266 "Retry Budget" (tryRetry, remainingBudget, configureBudget, getBudgetStats, resetBudget) Plus host: packages/@n8n/backend-network/src/http/retryability.ts and selected existing retry call sites What it is: Shared retry policies keyed by dependency/job class: same jitter/backoff primitive, same budget accounting, host-owned retryability predicate. New because: It does not invent retry semantics; it removes repeated mechanics while preserving domain decisions in n8n. Unlocks: Consistent cancellation/jitter, retry-pressure metrics, easier policy review and fewer copy-pasted loops. Evidence path: host failure -> retryability classifier -> tryRetry/remainingBudget -> retry(backoff/jitter) -> existing operation Effort: ~2–4 engineer-days integration (basis: 55 + 56 entry LOC + migration/parity tests across selected helpers). Constraints: BLD-ENG-303 Verified: C:ok I:ok B:— T:— S:scan; mode: direct; ports: none stated. BLD-ENG-266 Verified: C:ok I:ok B:— T:— S:scan; mode: direct; ports: none stated. B:— = Not claimed; T:— = Not claimed. Do not migrate workflow retryOnFail until user-visible parity is proven. Confidence: medium — useful, but much of the concept already exists in host-specific form.
DESIGN #4 — Causal Incident Explorer Built from: CMPSBL BLD-ENG-034 "Causal Event Propagation" (CausalEvent, PropagationRule, CausalChain, addRule, clearRules, propagate, getChain, getAllChains, getStats) + CMPSBL BLD-ENG-105 "Forensic Replay" (AuditEvent, ReplaySession, ReplayResult, ForensicReplayEngine) Plus host: packages/cli/src/eventbus/event-message-classes/** plus executionId/workflowId/node/queue/runner context What it is: A support/debug view that reconstructs a single execution as a cause-effect graph and lets an investigator replay the recorded event slice without re-running side effects. New because: Existing execution history is chronological/data-centric; this design adds explicit cause edges plus a forensic session abstraction. Unlocks: Faster root-cause analysis for distributed worker/queue/runner incidents. Evidence path: event stream -> deterministic parent rules -> causal chain -> read-only ReplaySession -> incident graph Effort: ~3–6 engineer-days (basis: 106 + 103 entry LOC + event relationship mapping/UI or export adapter/tests). Constraints: BLD-ENG-034 Verified: C:ok I:ok B:— T:— S:scan; mode: direct; ports: none stated. BLD-ENG-105 Verified: C:ok I:ok B:— T:— S:scan; mode: direct; ports: none stated. B:— = Not claimed; T:— = Not claimed. Causal claims must be limited to relationships the host can prove. Confidence: medium — valuable, but parent mapping needs careful domain review.
DESIGN #5 — Security Boundary Corpus Runner Built from: CMPSBL BLD-ENG-248 "Adversarial Input Generator" (ADVERSARIAL_CATALOG, generateAdversarialInputs) Plus host: packages/cli/src/middlewares/__tests__/body-parser.test.ts; packages/@n8n/backend-network/src/ssrf/__tests__/ssrf-protection.service.test.ts; rate-limit boundary tests What it is: A deterministic reusable corpus runner that applies the same security-shaped strings/payloads to multiple request boundaries and records which class caused each rejection/acceptance. New because: n8n already property-tests selected algorithms; this makes a shared security-specific corpus a first-class fixture rather than one-off cases. Unlocks: Cheap regression protection for encoding, Unicode, injection and overflow edge cases. Evidence path: generateAdversarialInputs -> host adapter -> existing boundary -> assertion/result label -> CI Effort: ~1–2 engineer-days integration (basis: 33 entry LOC + host adapters/fixtures/reporting; acquisition-equivalent size is hours under the kit band). Constraints: BLD-ENG-248 Verified: C:ok I:ok B:— T:— S:scan; mode: direct; ports: none stated; constraints: none. B:— = Not claimed; T:— = Not claimed. A finite catalog is not a completeness claim or penetration test. Confidence: high as a test-only quick win.
Scoreboard
| Measure | Value | Basis |
|---|---|---|
| Engineered catalog rows parsed | 1,162 | Basis: every Phase 2 row parsed; all IDs cross-checked against Phase 3 and merged catalog with 0 mismatches on ID/name/mode/entry/closure/Verified/constraints. |
| Host-matched candidates read in full | 44 | Basis: host-first seams plus explicit duplicate/mismatch controls; no catalog row was opened before the host freeze. |
| Items recommended | 8 | Basis: five-axis screen; all are direct TypeScript rows and all retain their catalog verification ceiling. |
| Rejected matched candidates | 36 | Basis: 44 matched − 8 carried; rejects remain visible in Step 2 and fixed-shape findings. |
| Subsystem rows screened | 16 | Basis: all Subsystem-class rows screened by full row metadata; Shadow Mesh was the only subsystem close enough to the host evaluation system to enter the 44-row matched set, and it was rejected as duplicate. |
| Quick wins | 3 | Basis: Event-chain sidecar, Retry Budget Adapter, Security Boundary Corpus Runner; each can start without changing workflow semantics. |
| New designs | 5 | Basis: Step 5B; each uses named catalog symbols + named n8n paths. |
| Composite components | 4 | Basis: Step 5A; each combines at least two catalog ingredients with n8n host code. |
| Discovery rows screened | 6,479 | Basis: full Discovery Vault “All discoveries” section: 1,510 `disc-*` + 4,969 `vdisc-*`; source unavailable pre-purchase, so shortlist is provisional and excluded from totals. |
| (A) Cost avoided | 0 weeks / US$0 | Basis: pinned repo contains no evidence these eight capabilities are funded/planned work; no hard-budget savings invented. |
| (B) Capability acquisition | 2–4.5 engineer-weeks / US$12,000–27,000 | Basis: 1,016 total entry LOC across 8 adopted rows + roughly 30 stated correctness concerns; kit entry-LOC approach with overlap discounted; never closure LOC. |
| (C) Portfolio reuse | 0 weeks / US$0 credited | Basis: no sibling n8n repositories were evaluated in this run. |
| Integration cost | 0.75–1.5 engineer-weeks / US$4,500–9,000 | Basis: TypeScript-direct integration, source/security review, adapters, tests, event canonicalization, feature flags, attribution and licence compliance review; no polyglot bridge cost. |
| Hard-budget net after licence | −US$9,499 to −US$4,999 | Basis: A US$0 − integration US$4.5k–9k − US$499; B and C are not folded into hard-budget net. |
| Counterfactual capability net | +US$2,501 to +US$22,001 | Basis: B US$12k–27k − integration US$4.5k–9k − US$499; only valid if the team wants these capabilities. |
| Licence-only break-even | 3.33 engineer-hours | Basis: US$499 / US$150 per senior engineer-hour; corrects stale kit text that says ~1.9 hours. |
Step 1
Host inventory was completed before catalog exposure. ZIP: 33,730 members = 27,048 regular files + 22 symlink entries + 6,660 directories. 19,556 TypeScript files; ~3,271,010 nonblank TS LOC.
| Host unit | Path | Exported surface | LOC | Job |
|---|---|---|---|---|
| Repo/build topology | package.json; pnpm-workspace.yaml | n8n-monorepo v2.36.0; Node >=24; pnpm >=10.22; TypeScript 6.0.2; Turbo monorepo | 542 | Defines a large TypeScript/Vue monorepo and dependency catalog. |
| Licence split | LICENSE.md; LICENSE_EE.md | LicenseRef-n8n-sustainable-use for ordinary source; separate n8n Enterprise License for .ee. files/dirs | 82 | Source-available open-core licensing boundary; important for where licensed third-party source may be attached. |
| Supply-chain evidence | security/sca/README.md | SBOM, SPDX gate, CycloneDX, VEX, Trivy/Grype, cosign/GitHub attestations | 104 | Mature software-supply-chain pipeline; generic provenance components should not duplicate it. |
| Endpoint rate-limit factory | packages/cli/src/services/rate-limit.service.ts | RateLimitService; IP-, body- and user-keyed express-rate-limit middleware | 87 | Creates two-layer endpoint rate limits; observed calls do not configure a shared store. |
| Multi-main config | packages/@n8n/config/src/configs/multi-main-setup.config.ts | MultiMainSetupConfig | 13 | Licensed multi-main mode; default TTL 10 s and check interval 3 s when enabled. |
| Multi-main leader lifecycle | packages/cli/src/scaling/multi-main-setup.ee.ts | MultiMainSetup | 193 | Leader election lifecycle; shutdown contains TODO to prove ownership before deleting Redis leader key. |
| Reusable Redis lease | packages/cli/src/scaling/redis-lock.service.ts | RedisLockService | 161 | Owner-token SET NX PX lock, compare-before-delete Lua, renewal watchdog and jitter; makes the leader TODO mostly an internal reuse/refactor seam. |
| SSRF boundary | packages/@n8n/backend-network/src/ssrf/ssrf-protection.service.ts | SsrfProtectionService | 309 | Allow/block/DNS/connect/redirect validation; mature egress defense. |
| HTTP transport | packages/@n8n/backend-network/src/http/undici/transport.ts | Undici transport/interceptors | 296 | Outbound HTTP/proxy/SSRF/authorizer path; no generic per-origin bulkhead was found. |
| Circuit breaker | packages/cli/src/utils/circuit-breaker.ts | CircuitBreaker | 265 | Mature CLOSED/OPEN/HALF_OPEN breaker; library breaker candidates are duplicates. |
| Workflow retry semantics | packages/core/src/execution-engine/workflow-execute.ts | WorkflowExecute | 2,590 | User-visible retryOnFail: 2–5 tries, fixed delay capped at 5 s; semantics must not be silently changed. |
| HTTP retry classifier | packages/@n8n/backend-network/src/http/retryability.ts | Retryability helpers | 188 | Classifies transport/DNS/status failures including 408/429/5xx and Retry-After semantics. |
| AI service retry helper | packages/cli/src/utils/ai-service-retry.ts | callAiServiceWithRetry | 96 | Three attempts with exponential backoff and 30 s timeout; comments state timed-out underlying SDK request cannot be aborted. |
| External-secrets retry | packages/cli/src/modules/external-secrets.ee/retry-manager.service.ts | ExternalSecretsRetryManager | 119 | Exponential scheduled retries; observed source keeps rescheduling failures with capped delay and no attempt ceiling. |
| Persisted deduplication | packages/core/src/data-deduplication-service.ts | DataDeduplicationService | 109 | Persisted processed-item checking/record/remove/clear/count for selected workloads. |
| Webhook handling | packages/cli/src/webhooks/waiting-webhooks.ts | WaitingWebhooks | 377 | Inbound/waiting webhooks, including HMAC-style waiting webhook flow and execution continuation. |
| Body parsing limits | packages/cli/src/middlewares/body-parser.ts | rawBodyReader; parseBody; bodyParser | 106 | Payload parsing/compression limits; default general payload limit observed at 16 MiB; multipart has separate larger limit. |
| Credential encryption | packages/core/src/encryption/aes-256-gcm.ts; packages/core/src/encryption/cipher.ts | CipherAes256GCM; Cipher | 177 | Versioned AES-256-GCM/HKDF plus legacy compatibility. |
| Encryption key management | packages/cli/src/modules/encryption-key-manager/key-manager.service.ts | KeyManagerService | 159 | Rotates active keys; retirement path contains TODO to check usage count before inactivation. |
| Public API keys | packages/cli/src/services/public-api-key.service.ts | PublicApiKeyService | 347 | Create/list/update/delete, scopes, expiration, rotation, audience and usage tracking. |
| Task runner hardening | packages/@n8n/task-runner/src/js-task-runner/js-task-runner.ts | JsTaskRunner | 602 | Timeouts, module allowlists, secure mode and prototype/Buffer hardening for user code. |
| Event bus | packages/cli/src/eventbus/** | 23 files; execution/audit/workflow/node/queue/runner/AI event families | 2,204 aggregate | Rich event stream and log persistence. Observed writer appends ordinary JSON lines; no hash/Merkle chain found. |
| Enterprise workflow evaluations | packages/cli/src/evaluation.ee/** | 49 files | 14,361 aggregate | Dataset/test-run/workflow-version evaluation system; shadow-run catalog candidates are mostly duplicate. |
| AI workflow evaluations | packages/@n8n/ai-workflow-builder.ee/evaluations/** | 159 files | 30,104 aggregate | Programmatic/LLM/pairwise evaluation harness; another reason not to claim generic shadow evaluation is missing. |
| Instance AI credits | packages/cli/src/modules/instance-ai/instance-ai-credit.service.ts | InstanceAiCreditService | 372 | Authoritative service-side billing claims, dedupe, quota lock, display/telemetry; generic budget components duplicate this control plane. |
| AI tracing | packages/@n8n/ai-utilities/src/utils/n8n-llm-tracing.ts | LLM tracing helpers | 272 | Records token usage and can record cost totals; generic cost attribution is not greenfield. |
| Property/E2E test estate | packages/testing/**; scheduler/workflow fast-check tests | 1,478 files under packages/testing | 287,724 aggregate under packages/testing | Large test platform plus property-based tests; adversarial input recommendation is deliberately narrow/test-only. |
Step 2
44 host-matched or false-positive-control rows were read in full after the host freeze. Twins are visible but never credited twice.
| Candidate | Direct fit | Combinatorial | Value | Cost/risk | Novelty | Carried? |
|---|---|---|---|---|---|---|
| `SUBP-06` BULKHEAD | Strong | Strong with retry budget/backoff | High | Medium | Medium | YES |
| `SUBP-05` TRIAGE | Weak incremental | Low | Low | Medium | Low | NO |
| `SUBP-04` HARNESS | Weak incremental | Low | Low | Medium | Low | NO |
| `BLD-ENG-303` retry-with-backoff | Medium | Strong standardizer | Medium | Medium | Low | YES |
| `BLD-ENG-266` Retry Budget | Strong | Strong with bulkhead/backoff | High | Low/medium | Medium | YES |
| `BLD-ENG-009` Tamper-Evident Chain | Strong | Strong with replay/attestation | High | Low/medium | Medium | YES |
| `STIER-S-71` Tamper-Evident Chain | Duplicate | None credited | None | Low | None | NO |
| `BLD-ENG-105` Forensic Replay | Medium/strong | Strong with chain/events | High | Medium | Medium | YES |
| `STIER-S-81` Compliance Attestation Generator | Medium | Strong with chain | High enterprise value | Medium | Medium | YES |
| `BLD-ENG-034` Causal Event Propagation | Medium | Strong with eventbus/replay | Medium/high | Medium | Medium | YES |
| `BLD-ENG-136` Audit-Grade Decision Ledger | Weak incremental | Low | Low | Medium | Low | NO |
| `STIER-S-CJ94` Audit-Grade Decision Ledger | Duplicate | None credited | None | Low | None | NO |
| `BLD-ENG-075` Self-Audit Loop | Weak incremental | Low | Low | Medium | Low | NO |
| `STIER-S-78` Self-Audit Loop | Duplicate | None credited | None | Low | None | NO |
| `BLD-ENG-229` Provenance Chain Verifier | Weak incremental | Low | Low | Medium | Low | NO |
| `BLD-ENG-246` Audit Log Ring | Weak/conditional | Low | Low | Medium | Low/medium | NO |
| `BLD-ENG-248` Adversarial Input Generator | Medium | Strong with existing tests | Medium | Low | Low/medium | YES |
| `STIER-S-CJ132` Adversarial Simulation Engine | Weak incremental | Low | Low | Medium | Low | NO |
| `BLD-ENG-050` Shadow Run Environment | Weak incremental | Low | Low | Medium | Low | NO |
| `STIER-S-124` Shadow Run Environment | Duplicate | None credited | None | Low | None | NO |
| `SUBP-07` CEILING | Weak incremental | Low | Low | Medium | Low | NO |
| `BLD-ENG-121` Autonomy Budget Manager | Weak incremental | Low | Low | Medium | Low | NO |
| `STIER-S-CJ79` Autonomy Budget Manager | Duplicate | None credited | None | Low | None | NO |
| `BLD-ENG-049` Realtime Cost Attribution | Weak incremental | Low | Low | Medium | Low | NO |
| `BLD-ENG-006` Cost-Aware Routing Engine | Weak/mismatched | Low | Low/negative | High | Low | NO |
| `BLD-ENG-047` Circuit Breaker Fabric | Weak incremental | Low | Low | Medium | Low | NO |
| `BLD-ENG-011` Circuit Breaker | Weak incremental | Low | Low | Medium | Low | NO |
| `BLD-ENG-045` Provider Health Monitor | Weak incremental | Low | Low | Medium | Low | NO |
| `BLD-ENG-078` Fallback Chain Architect | Weak/mismatched | Low | Low/negative | High | Low | NO |
| `STIER-S-101` Connector Orchestration Engine | Weak incremental | Low | Low | Medium | Low | NO |
| `BLD-ENG-109` External API Rate Limiter | Partial only | Low | Low for observed gap | High if misapplied | Low | NO |
| `STIER-S-133` External API Rate Limiter | Duplicate | None credited | None | Low | None | NO |
| `BLD-ENG-012` Rate Limiter | Partial only | Low | Low for observed gap | High if misapplied | Low | NO |
| `STIER-EXTRA-03` Rate Limiter | Duplicate | None credited | None | Low | None | NO |
| `STIER-S-119` Quota Intelligence Engine | Weak/conditional | Low | Low | Medium | Low/medium | NO |
| `BLD-ENG-089` Quota Intelligence | Duplicate | None credited | None | Low | None | NO |
| `BLD-ENG-215` Contract Evolution Mediator | Weak incremental | Low | Low | Medium | Low | NO |
| `BLD-ENG-202` Event-Driven Integration Mesh | Weak incremental | Low | Low | Medium | Low | NO |
| `BLD-ENG-096` Webhook Reliability | Weak/mismatched | Low | Low/negative | High | Low | NO |
| `STIER-S-114` Webhook Reliability Engine | Duplicate | None credited | None | Low | None | NO |
| `BLD-ENG-264` Idempotency Keys | Weak incremental | Low | Low | Medium | Low | NO |
| `STIER-S-ACC02` Adaptive Rate Limiting Engine | Partial only | Low | Low for observed gap | High if misapplied | Low | NO |
| `BLD-ENG-066` Adaptive Rate Limiting | Weak/conditional | Low | Low | Medium | Low/medium | NO |
| `SUBSYS-04` Shadow Mesh | Weak incremental | Low | Low | Medium | Low | NO |
Step 3
Every retained row says constraints: none verbatim; host constraints still apply.
| Component | Catalog constraint (verbatim) | Verified (verbatim) | Host constraint |
|---|---|---|---|
| `BLD-ENG-009` Tamper-Evident Chain | none | C:ok I:ok B:exec T:— S:scan | Canonical event serialization/persistence must be deterministic; existing event destinations remain authoritative. |
| `SUBP-06` BULKHEAD | none | C:ok I:ok B:load T:— S:scan | Start only on n8n-owned dependencies; user workflow traffic may rely on exact concurrency/latency behavior. |
| `BLD-ENG-266` Retry Budget | none | C:ok I:ok B:— T:— S:scan | Budget must refill/observe rather than permanently suppress recovery; external-secrets retry is intentionally long-lived. |
| `BLD-ENG-105` Forensic Replay | none | C:ok I:ok B:— T:— S:scan | Replay is read-only unless mapped to an explicit test harness; never re-execute side effects by default. |
| `STIER-S-81` Compliance Attestation Generator | none | C:ok I:ok B:load T:— S:scan | Attestation is evidence packaging, not an independent compliance/security certification. |
| `BLD-ENG-034` Causal Event Propagation | none | C:ok I:ok B:— T:— S:scan | Only assert causal edges that host identifiers/events can prove deterministically. |
| `BLD-ENG-303` retry-with-backoff | none | C:ok I:ok B:— T:— S:scan | Do not replace user-facing workflow retryOnFail semantics until parity is proven. |
| `BLD-ENG-248` Adversarial Input Generator | none | C:ok I:ok B:— T:— S:scan | Test-only first; finite catalog is not fuzzing completeness or penetration testing. |
Step 4
| Rank | Recommendation | Attach to | Effort | Why it matters | Risk |
|---|---|---|---|---|---|
| 1 | `BLD-ENG-009` Tamper-Evident Chain | packages/cli/src/eventbus/message-event-bus-writer/message-event-bus-log-writer-worker.ts (130 nonblank LOC); packages/cli/src/eventbus/event-message-classes/abstract-event-message.ts (123) | ~1–2 d | High: creates a new enterprise trust/evidence property on an existing event stream. | Low/medium: canonical serialization and chain persistence must be deterministic. |
| 2 | `SUBP-06` BULKHEAD | packages/cli/src/utils/ai-service-retry.ts (96 nonblank LOC); packages/@n8n/backend-network/src/http/undici/transport.ts (296 nonblank LOC) | ~3–5 d | High: bounds blast radius from hung or saturated n8n-owned providers. | Medium: queueing/rejection policy can change latency; deploy per dependency and observe first. |
| 3 | `BLD-ENG-266` Retry Budget | packages/cli/src/utils/ai-service-retry.ts (96 nonblank LOC); packages/cli/src/modules/external-secrets.ee/retry-manager.service.ts (119 nonblank LOC) | ~1–2 d | High: controls retry amplification without requiring retries to stop forever. | Low/medium: budget policy must preserve long-lived recovery behavior. |
| 4 | `BLD-ENG-105` Forensic Replay | packages/cli/src/eventbus/** (2,204 nonblank LOC aggregate); execution/audit event classes | ~1–3 d | High: shortens support/security reconstruction and enables evidence-backed regressions. | Medium: replay must be read-only unless explicitly mapped to a test harness. |
| 5 | `STIER-S-81` Compliance Attestation Generator | packages/cli/src/eventbus/**; workflow execution/audit records | ~1–2 d | High for enterprise audit/support: converts internal evidence into a portable receipt. | Medium: wording must not imply an independent security/compliance certification. |
| 6 | `BLD-ENG-034` Causal Event Propagation | packages/cli/src/eventbus/event-message-classes/abstract-event-message.ts (123 nonblank LOC); workflow/node/execution/queue/runner event families | ~1–3 d | Medium/high: makes distributed incident timelines explainable rather than merely chronological. | Medium: incorrect parent assignment is worse than no causal claim; start with deterministic relationships only. |
| 7 | `BLD-ENG-303` retry-with-backoff | packages/core/src/execution-engine/workflow-execute.ts (2,590 nonblank LOC); packages/cli/src/utils/ai-service-retry.ts (96); packages/cli/src/modules/external-secrets.ee/retry-manager.service.ts (119) | ~1–2 d | Medium: reduces retry-policy drift and repeated implementation work. | Medium: workflow retry behavior is user-facing; centralize internal helpers first. |
| 8 | `BLD-ENG-248` Adversarial Input Generator | packages/cli/src/middlewares/body-parser.ts (106 nonblank LOC); packages/@n8n/backend-network/src/ssrf/ssrf-protection.service.ts (309); packages/cli/src/services/rate-limit.service.ts (87) tests | ~0.5–1 d | Medium: cheap regression coverage at high-risk parsing/egress boundaries. | Low: test-only first; avoid mistaking a finite corpus for fuzzing completeness. |
[HARDEN] CMPSBL SUBP-06 "BULKHEAD" -> host: packages/cli/src/utils/ai-service-retry.ts (96 nonblank LOC); packages/@n8n/backend-network/src/http/undici/transport.ts (296 nonblank LOC) Why: Adds per-dependency concurrency and queue isolation where a timed-out or saturated external service can otherwise keep consuming process capacity. Start only on n8n-owned control-plane dependencies, not arbitrary user workflow traffic. Uses: BulkheadOptions, BulkheadRunOptions, Bulkhead, createBulkhead, BulkheadSubject, bulkheadContract, BulkheadRejection, BulkheadPolicy, RejectionReason +1 more Saves: ~1–3 engineer-weeks (basis: 539 entry LOC + compartment selection, queue/reject policy, concurrency accounting, snapshots and n8n-specific dependency-key tests; kit 400–1,200 LOC band). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL SUBP-05 "TRIAGE" -> host: packages/@n8n/backend-network/src/http/retryability.ts; packages/cli/src/utils/circuit-breaker.ts Why: n8n already has retryability classification, circuit breaking, queueing and domain-specific recovery; a 496-LOC general recovery ladder would overlap several mature systems. Uses: triageContract, createTriage, BUILT_IN_RULES, DEFAULT_CLASSIFICATION, classifyWith, normaliseKind, normaliseMessage, LadderRule, TriageOptions +8 more Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL SUBP-04 "HARNESS" -> host: packages/testing/**; packages/@n8n/scheduler/src/** tests Why: The repository already has very large unit/integration/property/E2E harnesses; a generic port-contract rig is useful only if CMPSBL ports are adopted later, not as host value by itself. Uses: httpContract, queueContract, secretsContract, stateContract, telemetryContract, defineContract, runContract, runSuite, PORT_CONTRACTS +9 more Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[HARDEN] CMPSBL BLD-ENG-303 "retry-with-backoff" -> host: packages/core/src/execution-engine/workflow-execute.ts (2,590 nonblank LOC); packages/cli/src/utils/ai-service-retry.ts (96); packages/cli/src/modules/external-secrets.ee/retry-manager.service.ts (119) Why: Provides one small jittered, cancellable retry primitive that can replace selected duplicated helper logic. It must not silently replace user-visible workflow retry semantics, which are a product contract. Uses: RetryOptions, retry Saves: ~3–8 engineer-hours (basis: 55 entry LOC + backoff/jitter/predicate/AbortSignal concerns; kit <100 LOC band). Verified: C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[HARDEN] CMPSBL BLD-ENG-266 "Retry Budget" -> host: packages/cli/src/utils/ai-service-retry.ts (96 nonblank LOC); packages/cli/src/modules/external-secrets.ee/retry-manager.service.ts (119 nonblank LOC) Why: Adds a refilling retry budget so separate retry loops share a pressure ceiling instead of each independently deciding that another retry is affordable. Particularly relevant to the external-secrets manager, whose scheduled retry loop has no attempt ceiling in the observed source. Uses: tryRetry, remainingBudget, configureBudget, getBudgetStats, resetBudget Saves: ~3–8 engineer-hours (basis: 56 entry LOC + budget/refill/observability concerns; kit <100 LOC band). Verified: C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[HARDEN] CMPSBL BLD-ENG-009 "Tamper-Evident Chain" -> host: packages/cli/src/eventbus/message-event-bus-writer/message-event-bus-log-writer-worker.ts (130 nonblank LOC); packages/cli/src/eventbus/event-message-classes/abstract-event-message.ts (123) Why: n8n already emits rich execution/audit events, but the observed log writer appends ordinary JSON lines and no hash/Merkle linkage was found. A sidecar chain can make selected evidence tamper-evident without replacing the event bus. Uses: createAuditChain Saves: ~4–8 engineer-hours (basis: 67 entry LOC + canonicalization/hash-link/persistence/verification concerns; kit <100 LOC band). Verified: C:ok I:ok B:exec T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:exec = entry point loads; zero-arity exports were executed twice and compared structurally; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL STIER-S-71 "Tamper-Evident Chain" -> host: eventbus evidence seam Why: Twin of the smaller carried BLD-ENG-009; counting both would double-count the same capability. Uses: createAuditChain Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:exec T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:exec = entry point loads; zero-arity exports were executed twice and compared structurally; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[HARDEN] CMPSBL BLD-ENG-105 "Forensic Replay" -> host: packages/cli/src/eventbus/** (2,204 nonblank LOC aggregate); execution/audit event classes Why: Turns captured audit/execution evidence into an incident reconstruction artifact. n8n has execution replay/test-run machinery, but no generic forensic event replay layer was found for the event-bus evidence stream. Uses: AuditEvent, ReplaySession, ReplayResult, ForensicReplayEngine Saves: ~1–3 engineer-days (basis: 103 entry LOC + event normalization/session slicing/replay/result concerns; kit 100–400 LOC band). Verified: C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[HARDEN] CMPSBL STIER-S-81 "Compliance Attestation Generator" -> host: packages/cli/src/eventbus/**; workflow execution/audit records Why: Packages selected evidence into an attestation-style report with cryptographic evidence chaining. This complements n8n’s existing SBOM/attestation pipeline, which is supply-chain focused rather than per-workflow execution evidence. Uses: EvidenceItem, Attestation, generateAttestation, batchAttest Saves: ~3–8 engineer-hours (basis: 57 entry LOC + evidence selection/attestation batching/output contract concerns; kit <100 LOC band). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[HARDEN] CMPSBL BLD-ENG-034 "Causal Event Propagation" -> host: packages/cli/src/eventbus/event-message-classes/abstract-event-message.ts (123 nonblank LOC); workflow/node/execution/queue/runner event families Why: The base event shape has id, timestamp, event name, message and payload, but no explicit parent/causal field was found. Causal propagation can add parent-child lineage across execution, node, queue and runner events without changing execution semantics. Uses: CausalEvent, PropagationRule, CausalChain, addRule, clearRules, propagate, getChain, getAllChains, getStats Saves: ~1–3 engineer-days (basis: 106 entry LOC + parent/rule/chain/stats concerns; kit 100–400 LOC band). Verified: C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-136 "Audit-Grade Decision Ledger" -> host: packages/cli/src/eventbus/** Why: A second decision ledger overlaps the carried tamper chain plus n8n’s existing event records; the report does not need both. Uses: LedgerEntry, AuditGradeDecisionLedger Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL STIER-S-CJ94 "Audit-Grade Decision Ledger" -> host: packages/cli/src/eventbus/** Why: Twin of BLD-ENG-136 and therefore excluded from sizing/value. Uses: LedgerEntry, AuditGradeDecisionLedger Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-075 "Self-Audit Loop" -> host: security/**; packages/cli/src/** audit services Why: n8n already has dedicated security/audit checks and operational telemetry; a generic self-audit registry was not tied to a missing host job strongly enough. Uses: AuditPolicy, AuditResult, AuditReport, registerPolicy, removePolicy, runAudit, getComplianceScore Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:exec T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:exec = entry point loads; zero-arity exports were executed twice and compared structurally; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL STIER-S-78 "Self-Audit Loop" -> host: security/** Why: Twin of BLD-ENG-075; excluded with it. Uses: AuditPolicy, AuditResult, AuditReport, registerPolicy, removePolicy, runAudit, getComplianceScore Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:exec T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:exec = entry point loads; zero-arity exports were executed twice and compared structurally; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-229 "Provenance Chain Verifier" -> host: security/sca/README.md Why: n8n already has a mature SBOM/VEX/attestation/signature pipeline for software supply-chain provenance. Event evidence is better served by the carried tamper chain. Uses: ProvenanceLink, ProvenanceVerdict, ProvenanceChainVerifier Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-246 "Audit Log Ring" -> host: packages/cli/src/eventbus/** Why: A capped FIFO audit ring is weaker than the existing persisted event-bus writer and database-backed event/execution systems. Uses: AuditEventType, AuditEntry, AuditLogRing Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[HARDEN] CMPSBL BLD-ENG-248 "Adversarial Input Generator" -> host: packages/cli/src/middlewares/body-parser.ts (106 nonblank LOC); packages/@n8n/backend-network/src/ssrf/ssrf-protection.service.ts (309); packages/cli/src/services/rate-limit.service.ts (87) tests Why: Adds a reusable injection/overflow/encoding/Unicode corpus to existing property and integration tests. n8n already uses fast-check in several packages, so this is a security-boundary fixture pack, not a replacement testing strategy. Uses: ADVERSARIAL_CATALOG, generateAdversarialInputs Saves: ~2–6 engineer-hours (basis: 33 entry LOC + corpus classification/adapter/assertion concerns; kit <100 LOC band). Verified: C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL STIER-S-CJ132 "Adversarial Simulation Engine" -> host: packages/testing/**; packages/cli/src/evaluation.ee/** Why: The description is broad and behavior evidence is only B:load; n8n already has substantial security, integration and evaluation tests. The smaller adversarial input generator has a clearer attachment. Uses: AttackScenario, SimulationResult, AdversarialSimulation Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-050 "Shadow Run Environment" -> host: packages/cli/src/evaluation.ee/** Why: n8n already ships a substantial enterprise Evaluation/test-run system that snapshots workflow versions and executes test runs; a generic shadow-run environment would duplicate it. Uses: ShadowRun, ShadowAssertion, createShadowRun, startRun, addAssertion, addLog, completeRun, getRun, listRuns Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL STIER-S-124 "Shadow Run Environment" -> host: packages/cli/src/evaluation.ee/** Why: Twin of BLD-ENG-050 and rejected for the same duplication. Uses: ShadowRun, ShadowAssertion, createShadowRun, startRun, addAssertion, addLog, completeRun, getRun, listRuns Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL SUBP-07 "CEILING" -> host: packages/cli/src/modules/instance-ai/instance-ai-credit.service.ts Why: Instance AI already has authoritative credit accounting, quotas, quota locking, usage claims and UI/telemetry updates. A second generic ceiling is not a clean incremental feature there. Uses: CeilingOptions, Ceiling, createCeiling, CeilingSubject, ceilingContract, METERS, Meter, MeterMap, CeilingSpec +5 more Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-121 "Autonomy Budget Manager" -> host: packages/cli/src/modules/instance-ai/instance-ai-credit.service.ts Why: n8n already meters/claims Instance AI credits and enforces quota locks; adding a parallel autonomy budget manager risks conflicting sources of truth. Uses: AutonomyBudget, BudgetAlert, SpendRequest, SpendResult, AutonomyBudgetManager Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL STIER-S-CJ79 "Autonomy Budget Manager" -> host: Instance AI credit system Why: Twin of BLD-ENG-121 and rejected for the same reason. Uses: AutonomyBudget, BudgetAlert, SpendRequest, SpendResult, AutonomyBudgetManager Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-049 "Realtime Cost Attribution" -> host: packages/@n8n/ai-utilities/src/utils/n8n-llm-tracing.ts Why: n8n AI tracing already records token totals and can record cost totals; generic cost attribution is not sufficiently novel. Uses: CostEntry, ModuleCostSummary, recordCost, getModuleCosts, getTotalCost, getLedgerSize Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-006 "Cost-Aware Routing Engine" -> host: AI/model nodes and Instance AI model resolution Why: Automatic cost-aware rerouting would violate workflows that explicitly select a model/provider/credential. This is a product-semantic mismatch for generic workflow execution. Uses: createCostRouter Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-047 "Circuit Breaker Fabric" -> host: packages/cli/src/utils/circuit-breaker.ts Why: n8n already has a mature circuit breaker with closed/open/half-open states, sliding failure window and half-open concurrency. A breaker fabric is not justified by the observed gap. Uses: BreakerState, CircuitBreaker, createBreaker, recordSuccess, recordFailure, canExecute, getBreaker, getAllBreakers, resetBreaker Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:exec T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:exec = entry point loads; zero-arity exports were executed twice and compared structurally; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-011 "Circuit Breaker" -> host: packages/cli/src/utils/circuit-breaker.ts Why: Direct duplicate of capability n8n already owns in a stronger host-specific implementation. Uses: CircuitState, CircuitBreakerConfig, CircuitStats, createCircuitBreaker, createBreakerPanel Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-045 "Provider Health Monitor" -> host: existing telemetry/circuit-breaker surfaces Why: Provider health is already represented through host telemetry/circuit state in the relevant control planes; no generic provider selector should override user-selected integrations. Uses: ProviderSample, ProviderHealth, recordSample, getProviderHealth, getAllProviderHealth, getBestProvider Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:exec T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:exec = entry point loads; zero-arity exports were executed twice and compared structurally; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-078 "Fallback Chain Architect" -> host: workflow node/provider semantics Why: Automatic fallback chains are unsafe for arbitrary workflow integrations because providers are not semantically interchangeable and users explicitly choose credentials/providers. Uses: ProviderSpec, FallbackChain, buildFallbackChain Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL STIER-S-101 "Connector Orchestration Engine" -> host: packages/nodes-base/**; packages/core/** Why: n8n itself is already a connector orchestration product with node lifecycle, credentials, retries and 1,500+ integrations; importing a generic connector orchestrator would mostly duplicate the host. Uses: Connector, registerConnector, pingConnector, getConnector, listConnectors, removeConnector, executeWithRetry Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-109 "External API Rate Limiter" -> host: packages/cli/src/services/rate-limit.service.ts; multi-main deployment Why: The catalog API exposes no shared-state/store port, so pre-purchase metadata cannot establish process-global/provider-global quota enforcement. It does not solve the observed multi-main state seam. Uses: RateLimitConfig, RateLimitResult, ExternalAPIRateLimiter Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL STIER-S-133 "External API Rate Limiter" -> host: multi-main rate-limit seam Why: Twin of BLD-ENG-109 and has the same missing distributed-state evidence; excluded. Uses: RateLimitConfig, RateLimitResult, ExternalAPIRateLimiter Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-012 "Rate Limiter" -> host: packages/cli/src/services/rate-limit.service.ts Why: No shared-state/store port is exposed in the catalog API; it cannot honestly replace a multi-process limiter where global counters matter. Uses: Strategy, RateLimitConfig, RateLimitResult, createRateLimiter Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL STIER-EXTRA-03 "Rate Limiter" -> host: packages/cli/src/services/rate-limit.service.ts Why: Twin of BLD-ENG-012; multi-strategy choice does not solve the distributed-state problem. Uses: Strategy, RateLimitConfig, RateLimitResult, createRateLimiter Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL STIER-S-119 "Quota Intelligence Engine" -> host: third-party integration quota surfaces Why: Quota prediction requires authoritative quota limits and shared consumption state per provider. The catalog row does not expose the host adapters needed to establish that globally. Uses: QuotaConfig, QuotaWarning, registerQuota, consumeQuota, getWarning, listQuotas Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:exec T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:exec = entry point loads; zero-arity exports were executed twice and compared structurally; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-089 "Quota Intelligence" -> host: third-party integration quota surfaces Why: Smaller twin/variant of quota intelligence; same authoritative-state problem. Uses: QuotaConfig, QuotaWarning, registerQuota, consumeQuota, getWarning, listQuotas Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-215 "Contract Evolution Mediator" -> host: nodes-base node versions; workflow migrations Why: n8n already has node typeVersion/versioned descriptions and migration machinery. A generic contract mediator was not shown to improve that host-specific versioning model. Uses: ContractVersion, Contract, ContractEvolutionMediator Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-202 "Event-Driven Integration Mesh" -> host: packages/cli/src/eventbus/**; scaling/queue system Why: n8n already has event-bus persistence plus Redis/Bull queueing/scaling. A second generic pub-sub mesh would create parallel delivery semantics. Uses: EventStream, DeadLetter, EventDrivenIntegrationMesh Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-096 "Webhook Reliability" -> host: packages/cli/src/webhooks/**; Webhook node Why: The row describes webhook delivery reliability, while n8n’s primary generic Webhook node is an inbound trigger. Applying outbound-delivery semantics there would be a category error. Uses: WebhookEvent, DeliveryAttempt, WebhookConfig, WebhookReliabilityEngine Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL STIER-S-114 "Webhook Reliability Engine" -> host: packages/cli/src/webhooks/** Why: Richer twin/variant of outbound webhook delivery; still the wrong trust/direction model for n8n’s inbound generic webhook surface. Uses: WebhookEvent, DeliveryAttempt, WebhookConfig, WebhookStore, DeliveryDisposition, WebhookReliabilityEngine Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-264 "Idempotency Keys" -> host: packages/core/src/data-deduplication-service.ts Why: Its catalog behavior is an in-memory TTL/in-flight cache, while n8n already has persisted deduplication for selected workloads. It is insufficient as a cross-process generic webhook idempotency guarantee. Uses: withIdempotency, hasIdempotencyKey, clearIdempotencyKey, getIdempotencyStats Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL STIER-S-ACC02 "Adaptive Rate Limiting Engine" -> host: packages/cli/src/services/rate-limit.service.ts Why: Adaptive local limiting does not address the observed multi-main/shared-counter seam; no shared-state port appears in the catalog API. Uses: RateLimiter, createLimiter, tryConsume, adaptLimit, getLimiter, listLimiters Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:exec T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:exec = entry point loads; zero-arity exports were executed twice and compared structurally; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL BLD-ENG-066 "Adaptive Rate Limiting" -> host: packages/cli/src/services/rate-limit.service.ts Why: Same issue as the adaptive S-tier limiter: useful local policy, but no evidence it can coordinate counters across main processes. Uses: RateLimiter, createLimiter, tryConsume, adaptLimit, getLimiter, listLimiters Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
[SKIP] CMPSBL SUBSYS-04 "Shadow Mesh" -> host: packages/cli/src/evaluation.ee/** Why: n8n already has workflow Evaluation/test-run machinery and partial/manual execution; a 14-LOC traffic-mirroring subsystem row is not enough pre-purchase evidence to displace that system. Uses: generateAdversarialInputs, runShadowProbe, runAllShadowProbes, runShadowBatch, startShadowScheduler, stopShadowScheduler, getShadowMeshAnalytics, runShadowBuild, runAllShadowBuilds +6 more Saves: 0 engineer-days credited (basis: rejected candidate; no adoption value counted). Verified: C:proj(14) I:ok B:— T:— S:scan — C:proj(14) = compiles under project settings but strict isolated pass records the stated error count; not C:ok; I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security audit Mode: direct Ports to implement: none stated in catalog metadata
| Gap / seam | Host evidence | Library fit | Decision |
|---|---|---|---|
| Tamper-evident workflow/execution evidence | Rich event bus; no hash/Merkle chain found. | BLD-ENG-009 + STIER-S-81 + BLD-ENG-105 | ADDRESS. |
| Causal lineage | Base event shape has no explicit parent field. | BLD-ENG-034 | ADDRESS, deterministic edges only. |
| Internal dependency concurrency isolation | No generic per-provider bulkhead found. | SUBP-06 | ADDRESS for n8n-owned dependencies. |
| Retry pressure | Fragmented retry loops; external-secrets can reschedule indefinitely. | BLD-ENG-266 + BLD-ENG-303 | ADDRESS selectively. |
| Distributed endpoint rate-limit state | No visible shared store in RateLimitService; multi-main exists. | No catalog store port. | UNRESOLVED. |
| Leader clear ownership | Explicit TODO. | Host RedisLockService already stronger. | HOST-ONLY FIX. |
| Encryption-key retirement | Usage-count TODO. | No strong library fit. | HOST-ONLY review. |
| AI budgets | Existing authoritative credits/quota lock. | Budget/cost rows duplicate. | SKIP. |
| Workflow shadow/evaluation | Large existing evaluation systems. | Shadow rows duplicate. | SKIP. |
| Generic webhook exactly-once | Persisted dedupe exists selectively; catalog idempotency is in-memory TTL. | Insufficient for cross-process generic guarantee. | UNRESOLVED. |
| CMPSBL delivery redistribution boundary | n8n source-visible product distribution is permitted; republishing the CMPSBL delivery itself is not. | Not a component issue. | ADDRESS with internal delivery handling + attribution. |
Step 6
| Bucket | Engineering time | USD | Basis |
|---|---|---|---|
| (A) Cost avoided | 0 weeks | US$0 | No funded/planned evidence. |
| (B) Capability acquisition | 2–4.5 weeks | US$12,000–27,000 | 1,016 entry LOC + ~30 correctness concerns, overlap discounted. |
| (C) Portfolio reuse | 0 weeks | US$0 | No sibling repos evaluated. |
| Integration | 0.75–1.5 weeks | US$4,500–9,000 | Source/security review, adapters, tests, flags, legal/distribution review. |
| Licence | 3.33 h equivalent | US$499 | 499/150. |
| Hard-budget net | negative | −US$9,499 to −US$4,999 | A − integration − licence. |
| Counterfactual capability net | positive | +US$2,501 to +US$22,001 | B − integration − licence if capability desired. |
Not claimed. n8n already demonstrates sophisticated independent engineering. The defensible value is prebuilt implementation and synthesis, not conceptual exclusivity.
Yes, technically, if either major capability family is wanted. Even low capability value minus high integration and the US$499 fee remains positive by about US$2,501. If post-purchase source review weakens the retained claims or n8n does not want these capabilities, the recommendation becomes HOLD regardless of the low licence price.
Step 7
| Window | Work | Exit criteria |
|---|---|---|
| Days 0–10 | Purchase/grant + attribution plan; source audit of 8 rows; isolated n8n typecheck/tests. | Purchase/grant recorded; source/API matches catalog; abort failing rows. |
| Days 11–30 | Read-only Execution Evidence Capsule sidecar; test-only security corpus. | No production semantics change; deterministic chain verification. |
| Days 31–45 | Retry budget + bulkhead behind flags on one n8n-owned dependency. | Acceptable latency/concurrency; no starvation; observable pressure. |
| Days 46–60 | Forensic slice + attestation export; deterministic causal edges. | Read-only replay; no compliance overclaim; mapping tests pass. |
| Days 61–75 | Expand failure cell to second internal dependency; optionally centralize internal retry mechanics. | No workflow retry contract drift; rollback tested. |
| Days 76–90 | Decide product surface; read provisional Discovery source. | Go/no-go based on usage, overhead, legal fit, source quality. |
Do not start: breaker/SSRF/API-key/encryption/evaluation/credit replacements; local catalog limiters as a multi-main fix; automatic provider fallback for user workflows.
Discovery Vault — provisional, kept out of every total
All 6,479 Discovery Vault rows were screened by index metadata. No Discovery source/API/LOC/verification is credited pre-purchase.
Replays event histories while mapsing governance topology across the substrate.
self-contained: verified; TypeScript pack: Not claimed; runtime smoke: build-checked; static security sweep: clean; security audit: Not claimed · observability · ATLAS -> CALIBER -> ECHO -> LINEAGE -> METRIC
Potential complement to the causal incident design; read source only after purchase and compare it against BLD-ENG-034 before crediting anything.
PROVISIONAL — index row only, source not read (pre-purchase)Pre-emptive request dispatch to multiple providers with first-response selection
self-contained: verified; TypeScript pack: Not claimed; runtime smoke: build-checked; static security sweep: clean; security audit: Not claimed · routing · ATLAS -> CORTEX -> NEXUS
Interesting only for n8n-owned idempotent provider reads; speculative fan-out can multiply cost and side effects, so it is unsafe for arbitrary workflows without strict gating.
PROVISIONAL — index row only, source not read (pre-purchase)Inspects structural patterns while unifiesing external interfaces across the substrate.
self-contained: verified; TypeScript pack: Not claimed; runtime smoke: build-checked; static security sweep: clean; security audit: Not claimed · integration · INTEGRATION -> NEXUS -> ULT_MERIDIAN -> VISION
Potentially relevant to n8n’s huge connector estate, but the index description is too generic to establish any API or value pre-purchase.
PROVISIONAL — index row only, source not read (pre-purchase)Generates flame graphs of cognitive execution paths
self-contained: verified; TypeScript pack: Not claimed; runtime smoke: build-checked; static security sweep: clean; security audit: Not claimed · observability · OBSERVABILITY -> CORTEX -> BRAIN -> ANALYTICS
Could visualize Instance AI/agent execution paths, but source and TypeScript-pack verification are Not claimed; treat as a reading lead, not a recommendation.
PROVISIONAL — index row only, source not read (pre-purchase)Step 8 — appended, never merged into the body
| Claim above | Re-check result | Estimate change |
|---|---|---|
| “27,048 files” host inventory | Confirmed as 27,048 regular archive files. The ZIP also contains 22 symbolic-link entries and 6,660 directories, for 33,730 members total. | No recommendation/value change; archive-shape wording corrected so another evaluator can reproduce the count. |
| Original host remained read-only | SHA-256/size recheck of all 27,048 original regular files: 0 missing, 0 changed, 0 unexpected non-report files. | Confirmed. Final allowed delta is exactly the two required report files. |
| TypeScript/Vue scale | Confirmed 19,556 .ts files and 1,253 .vue files in the original-file manifest. | No estimate change. |
| Multi-main endpoint limiter seam | Re-read RateLimitService at lines 31-74: observed express-rate-limit construction provides no shared store; multi-main remains a real consistency question, but runtime routing/stickiness was not proven from source. | Kept UNRESOLVED; no catalog limiter credited because catalog metadata exposes no shared-state/store port. |
| Retry-pressure seam | AI helper lines 27-29 explicitly says a timed-out underlying SDK request cannot be aborted; external-secrets retry manager lines 62-91 reschedules with increasing attempt count and no observed ceiling. | Confirmed Provider Failure Cell motivation; user-visible workflow retry semantics remain excluded. |
| Event evidence seam | Event writer line 89 appends serialized JSON lines; base event lines 84-92 expose id/time/name/message/payload without an explicit parent field. | Confirmed the evidence/causal opportunity; still an absence finding, not a claim that existing execution storage is unsafe. |
| CMPSBL public/source-visible distribution gate | The first report draft over-read “non-sublicensable” as requiring written permission for n8n. Authoritative LICENSE §§1.1(c)-1.3 expressly permit embedding in a substantial product distributed as packages/services; §§2.1-2.2 prohibit redistributing the Library itself. | Gate reduced to the actual Step 0 blocker: no purchase/grant record yet, plus required attribution. No written-permission gate for ordinary n8n product embedding. |
| Per-component build-equivalent sizing | Initial draft understated the 539-entry-LOC BULKHEAD row as days. Rechecked against the kit estimation bands: 400-1,200 entry LOC maps to 1-3 engineer-weeks; sub-100 rows map to hours. | Fixed-shape Saves lines corrected. Aggregate Bucket B stays 2-4.5 weeks because overlapping capabilities are discounted rather than summed mechanically. |
| Kit licensing/pricing text is internally consistent | Not confirmed. LICENSE, LICENSING.md and AGENTS.md say one US$499 one-time perpetual licence with no source disclosure. CATALOG-PHASE-1-DIRECTIVES.md, docs/LICENSE-COMPATIBILITY.md, EXAMPLE-INTEGRATION-REPORT.html and the template CTA retain retired annual/copyleft-door language. | Authoritative current files win. Report uses US$499 once and 3.33 h at US$150/h; stale 1.9 h/annual/source-release text is rejected. |
| Layer attachment metadata can be read literally | Not safe. Phase 2 lists VerticalLayerPack rows as Mode: direct, while AGENTS.md rule 12 says AscensionLayer/Primitive-Layer/VerticalLayerPack artifacts are not attachable by import and only take effect via Ascension Layer 2 emission. | No retained n8n recommendation uses a layer. Future evaluators must let the layer rule override a “direct” mode cell for attachment semantics. |
| Discovery Vault count | Confirmed 6,479 index rows when both ID families are counted: 1,510 disc-* plus 4,969 vdisc-*. | No savings/value credited; four rows remain provisional index-only reading leads. |
The final inventory check confirms that the evaluation modified no original n8n source. The two material corrections were in the evaluator/kit layer rather than the host: the archive member count needed symlink/directory qualification, and the first draft incorrectly created a public-source written-permission gate that the authoritative CMPSBL licence does not impose on a substantial product such as n8n.
Kit edge-case result: the current licence files and AGENTS.md must override stale Phase-1/template/example licensing prose, and layer-class attachment rules must override catalog cells that say Mode: direct. These inconsistencies did not change the eight retained n8n components, but they can change a future evaluator's verdict if read literally.
Claim ceiling
Extracted from systems the author has run in production since August 2025. Operationally exercised, not independently security-audited.
In pre-purchase evaluation, verification axes quoted in this report come verbatim from the generated AGENT-HANDOFF-CATALOG.md, which is the pre-purchase source of truth; in a full delivery, artifacts/<ID>/artifact-manifest.json is authoritative and overrides it. Every retained component records T:—, meaning Not claimed test coverage, and no component is claimed here to have had an independent third-party security review. Static scan results are the author's own.
BLD-ENG-009 Tamper-Evident Chain — C:ok I:ok B:exec T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:exec = entry point loads; zero-arity exports were executed twice and compared structurally; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security auditSUBP-06 BULKHEAD — C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security auditBLD-ENG-266 Retry Budget — C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security auditBLD-ENG-105 Forensic Replay — C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security auditSTIER-S-81 Compliance Attestation Generator — C:ok I:ok B:load T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:load = entry point imports cleanly and exposes exports; no zero-arity behavior was fabricated; T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security auditBLD-ENG-034 Causal Event Propagation — C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security auditBLD-ENG-303 retry-with-backoff — C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security auditBLD-ENG-248 Adversarial Input Generator — C:ok I:ok B:— T:— S:scan — C:ok = Compiles (batch tsgo --strict --noEmit); I:ok = installed with install.mjs into an empty host and type-checked there with tsgo --noEmit --skipLibCheck; B:— = Not claimed (behavior); T:— = Not claimed (test coverage); S:scan = author's 13-rule deterministic static unsafe-construct sweep reported clean; not an independent security auditGoverned runtime status: Not claimed. No CMPSBL implementation was installed or executed in n8n during this pre-purchase evaluation.
The catalog evaluated here contains 1,162 engineered component rows. The authoritative current licence is US$499 USD paid once, perpetual, per company; it allows private modification and embedding in a product with substantial independent function, with no source-disclosure obligation. Rights cover the delivered release and releases published in the twelve months following purchase. Offline delivery; no CMPSBL source was present in this pre-purchase kit.