# Planifest - Backend Stack Evaluation


Purpose

This document evaluates backend frameworks and languages for use in Planifest's agentic CI/CD pipeline, where code is generated by AI agents (via LLM API), not written by humans. Traditional developer-experience priorities are irrelevant. The sole question is: what gets an LLM to write correct, production-ready code with minimal iteration?

See also: Frontend Stack Evaluation - the companion evaluation covering 10 frontend frameworks against agent-specific criteria.


Evaluation Summary

Scoring Key

Stars Meaning
★★★★★ Best in class - near-zero agent iteration needed
★★★★ Strong - occasional iteration, mostly correct first time
★★★ Adequate - regular iteration needed but manageable
★★ Weak - frequent iteration, many classes of bugs slip through
★ Poor - unsuitable for agent-generated code

1. Node.js + Express / Fastify / Hono (TypeScript)

Note: Evaluated with TypeScript enabled throughout. Plain JavaScript would score significantly lower.

Compile-Time Error Detection

Score: ★★★

Error Feedback Clarity

Score: ★★★★

Type System

Score: ★★★

Concurrency Safety

Score: ★★

Memory Safety

Score: ★★★★

Error Handling

Score: ★★

Testing Framework

Score: ★★★★

Dependency Management

Score: ★★★

Third-Party Integration Coverage

Coverage: ~95%

Container Characteristics

Observability

Score: ★★★★

Operational Stability

Score: ★★★

Ecosystem Completeness

Score: ★★★★★

Horizontal Scalability

Score: ★★★

Type Safety Across Boundaries

Score: ★★★★

Async/Concurrency Model

Score: ★★★

Overall Agent-Suitability

Score: ★★★★

Best Use Cases

Avoid If

Key Risks

  1. Silent failures: Unhandled promise rejections, swallowed exceptions, missing await
  2. Type system escape hatches: any, type assertions, and @ts-ignore let incorrect code compile
  3. Supply chain: npm dependency tree depth creates a large attack surface

2. Python + FastAPI / Django

Compile-Time Error Detection

Score: ★★

Error Feedback Clarity

Score: ★★★★

Type System

Score: ★★

Concurrency Safety

Score: ★★

Memory Safety

Score: ★★★★

Error Handling

Score: ★★

Testing Framework

Score: ★★★★

Dependency Management

Score: ★★★

Third-Party Integration Coverage

Coverage: ~90%

Container Characteristics

Observability

Score: ★★★

Operational Stability

Score: ★★★★

Ecosystem Completeness

Score: ★★★★

Horizontal Scalability

Score: ★★★

Type Safety Across Boundaries

Score: ★★★

Async/Concurrency Model

Score: ★★★

Overall Agent-Suitability

Score: ★★★

Best Use Cases

Avoid If

Key Risks

  1. Runtime-only errors: Type bugs surface in production, not at build time
  2. Async/sync mixing: Blocking calls in async handlers cause silent performance degradation
  3. Dependency packaging: Complex dependency trees with C extensions can break container builds

3. Go + Gin / Chi / Echo

Compile-Time Error Detection

Score: ★★★★

Error Feedback Clarity

Score: ★★★★★

Type System

Score: ★★★

Concurrency Safety

Score: ★★★

Memory Safety

Score: ★★★★

Error Handling

Score: ★★★★

Testing Framework

Score: ★★★★

Dependency Management

Score: ★★★★★

Third-Party Integration Coverage

Coverage: ~80%

Container Characteristics

Observability

Score: ★★★★★

Operational Stability

Score: ★★★★★

Ecosystem Completeness

Score: ★★★★

Horizontal Scalability

Score: ★★★★★

Type Safety Across Boundaries

Score: ★★★★

Async/Concurrency Model

Score: ★★★★

Overall Agent-Suitability

Score: ★★★★

Best Use Cases

Avoid If

Key Risks

  1. Nil pointer panics: nil interface values and pointer dereferences are the #1 runtime crash in Go
  2. Goroutine leaks: LLMs create goroutines that never terminate, slowly consuming memory
  3. Error swallowing: _ = someFunction() discards errors - LLMs do this when the error handling seems tedious

4. Rust + Axum / Actix-web / Rocket

Compile-Time Error Detection

Score: ★★★★★

Error Feedback Clarity

Score: ★★★

Type System

Score: ★★★★★

Concurrency Safety

Score: ★★★★★

Memory Safety

Score: ★★★★★

Error Handling

Score: ★★★★★

Testing Framework

Score: ★★★★

Dependency Management

Score: ★★★★★

Third-Party Integration Coverage

Coverage: ~55%

Container Characteristics

Observability

Score: ★★★★

Operational Stability

Score: ★★★★

Ecosystem Completeness

Score: ★★★

Horizontal Scalability

Score: ★★★★★

Type Safety Across Boundaries

Score: ★★★★

Async/Concurrency Model

Score: ★★★★★

Overall Agent-Suitability

Score: ★★★

Best Use Cases

Avoid If

Key Risks

  1. Iteration cost: LLMs spend 5-10x more iterations fighting the borrow checker than equivalent Go/TS code
  2. SDK gaps: Must write HTTP wrappers for ~45% of common integrations
  3. Complexity ceiling: Complex async + lifetime + trait bound interactions can stall agent self-correction entirely

5. Java + Spring Boot

Compile-Time Error Detection

Score: ★★★★

Error Feedback Clarity

Score: ★★★

Type System

Score: ★★★★

Concurrency Safety

Score: ★★★

Memory Safety

Score: ★★★★

Error Handling

Score: ★★★★

Testing Framework

Score: ★★★★★

Dependency Management

Score: ★★★★

Third-Party Integration Coverage

Coverage: ~90%

Container Characteristics

Observability

Score: ★★★★★

Operational Stability

Score: ★★★★★

Ecosystem Completeness

Score: ★★★★★

Horizontal Scalability

Score: ★★★★

Type Safety Across Boundaries

Score: ★★★★★

Async/Concurrency Model

Score: ★★★★

Overall Agent-Suitability

Score: ★★★★

Best Use Cases

Avoid If

Key Risks

  1. Boilerplate volume: Agent generates more code than necessary, increasing surface area for bugs
  2. Spring magic: Annotation-based configuration can produce surprising runtime behaviour
  3. JVM cold start: 3-10s startup makes scale-to-zero and rapid scaling painful

6. C# + ASP.NET Core

Compile-Time Error Detection

Score: ★★★★

Error Feedback Clarity

Score: ★★★★

Type System

Score: ★★★★

Concurrency Safety

Score: ★★★

Memory Safety

Score: ★★★★

Error Handling

Score: ★★★

Testing Framework

Score: ★★★★

Dependency Management

Score: ★★★★

Third-Party Integration Coverage

Coverage: ~85%

Container Characteristics

Observability

Score: ★★★★

Operational Stability

Score: ★★★★★

Ecosystem Completeness

Score: ★★★★★

Horizontal Scalability

Score: ★★★★

Type Safety Across Boundaries

Score: ★★★★

Async/Concurrency Model

Score: ★★★★★

Overall Agent-Suitability

Score: ★★★★

Best Use Cases

Avoid If

Key Risks

  1. Ecosystem bias: Azure SDKs are first-class; AWS/GCP SDKs lag slightly
  2. Training data volume: Fewer LLM training examples than Java/Python/Node, potentially less reliable generation
  3. Exception-based errors: No forced error handling means silent failures are possible

7. TypeScript + Deno (Fresh / Oak / Hono)

Compile-Time Error Detection

Score: ★★★

Error Feedback Clarity

Score: ★★★★

Type System

Score: ★★★

Concurrency Safety

Score: ★★

Memory Safety

Score: ★★★★

Error Handling

Score: ★★

Testing Framework

Score: ★★★★

Dependency Management

Score: ★★★★

Third-Party Integration Coverage

Coverage: ~75%

Container Characteristics

Observability

Score: ★★★

Operational Stability

Score: ★★

Ecosystem Completeness

Score: ★★★

Horizontal Scalability

Score: ★★★

Type Safety Across Boundaries

Score: ★★★★

Async/Concurrency Model

Score: ★★★

Overall Agent-Suitability

Score: ★★★

Best Use Cases

Avoid If

Key Risks

  1. LLM unfamiliarity: Agents generate Node.js patterns that don't work in Deno
  2. Ecosystem immaturity: Breaking changes, missing libraries, compatibility gaps
  3. npm compatibility is imperfect: Native modules and some Node APIs fail silently

8. Ruby + Rails / Sinatra

Compile-Time Error Detection

Score: ★

Error Feedback Clarity

Score: ★★★

Type System

Score: ★

Concurrency Safety

Score: ★★

Memory Safety

Score: ★★★★

Error Handling

Score: ★★

Testing Framework

Score: ★★★★

Dependency Management

Score: ★★★

Third-Party Integration Coverage

Coverage: ~75%

Container Characteristics

Observability

Score: ★★★

Operational Stability

Score: ★★★★

Ecosystem Completeness

Score: ★★★★

Horizontal Scalability

Score: ★★★

Type Safety Across Boundaries

Score: ★★

Async/Concurrency Model

Score: ★★

Overall Agent-Suitability

Score: ★★

Best Use Cases

Avoid If

Key Risks

  1. No compile-time safety: All bugs are runtime bugs
  2. Convention dependency: Agent must follow Rails conventions exactly or face cryptic errors
  3. Performance: Ruby's runtime speed and memory footprint limit scaling

9. Elixir + Phoenix

Compile-Time Error Detection

Score: ★★

Error Feedback Clarity

Score: ★★★

Type System

Score: ★★

Concurrency Safety

Score: ★★★★★

Memory Safety

Score: ★★★★

Error Handling

Score: ★★★★

Testing Framework

Score: ★★★

Dependency Management

Score: ★★★★

Third-Party Integration Coverage

Coverage: ~50%

Container Characteristics

Observability

Score: ★★★

Operational Stability

Score: ★★★★

Ecosystem Completeness

Score: ★★★

Horizontal Scalability

Score: ★★★★★

Type Safety Across Boundaries

Score: ★★

Async/Concurrency Model

Score: ★★★★★

Overall Agent-Suitability

Score: ★★★

Best Use Cases

Avoid If

Key Risks

  1. LLM unfamiliarity: Agents generate incorrect Elixir patterns, especially around OTP
  2. SDK gaps: Must write HTTP wrappers for ~50% of common integrations
  3. Niche ecosystem: Hiring, community support, and library availability are limited

10. Kotlin + Ktor

Compile-Time Error Detection

Score: ★★★★

Error Feedback Clarity

Score: ★★★★

Type System

Score: ★★★★★

Concurrency Safety

Score: ★★★

Memory Safety

Score: ★★★★

Error Handling

Score: ★★★

Testing Framework

Score: ★★★★

Dependency Management

Score: ★★★★

Third-Party Integration Coverage

Coverage: ~85%

Container Characteristics

Observability

Score: ★★★★

Operational Stability

Score: ★★★★

Ecosystem Completeness

Score: ★★★★

Horizontal Scalability

Score: ★★★★

Type Safety Across Boundaries

Score: ★★★★

Async/Concurrency Model

Score: ★★★★★

Overall Agent-Suitability

Score: ★★★★

Best Use Cases

Avoid If

Key Risks

  1. LLM generates Java-in-Kotlin: Idiomatic Kotlin is different from Java; agents sometimes produce awkward hybrids
  2. JVM cold start: Same as Java
  3. Ktor ecosystem: Smaller than Spring Boot - fewer plugins and integrations

11. Scala + Play / ZIO

Compile-Time Error Detection

Score: ★★★★★

Error Feedback Clarity

Score: ★★

Type System

Score: ★★★★★

Concurrency Safety

Score: ★★★★

Memory Safety

Score: ★★★★

Error Handling

Score: ★★★★★

Testing Framework

Score: ★★★

Dependency Management

Score: ★★★

Third-Party Integration Coverage

Coverage: ~75%

Container Characteristics

Observability

Score: ★★★

Operational Stability

Score: ★★★

Ecosystem Completeness

Score: ★★★

Horizontal Scalability

Score: ★★★★

Type Safety Across Boundaries

Score: ★★★★

Async/Concurrency Model

Score: ★★★★★

Overall Agent-Suitability

Score: ★★

Best Use Cases

Avoid If

Key Risks

  1. LLM incompetence: Agents generate incorrect Scala far more often than Go/Java/TS
  2. Compilation speed: Slow feedback loops increase iteration time
  3. Ecosystem fragmentation: Scala 2 vs 3, Cats vs ZIO, Play vs http4s - LLMs mix idioms

12. PHP + Laravel / Symfony

Compile-Time Error Detection

Score: ★★

Error Feedback Clarity

Score: ★★★

Type System

Score: ★★

Concurrency Safety

Score: ★

Memory Safety

Score: ★★★★

Error Handling

Score: ★★

Testing Framework

Score: ★★★★

Dependency Management

Score: ★★★★

Third-Party Integration Coverage

Coverage: ~80%

Container Characteristics

Observability

Score: ★★★

Operational Stability

Score: ★★★★

Ecosystem Completeness

Score: ★★★★

Horizontal Scalability

Score: ★★★

Type Safety Across Boundaries

Score: ★★

Async/Concurrency Model

Score: ★★

Overall Agent-Suitability

Score: ★★★

Best Use Cases

Avoid If

Key Risks

  1. No compile-time safety: All bugs are runtime bugs
  2. Concurrency limitations: No within-request parallelism without Swoole
  3. Perception and hiring: PHP has a reputation problem that may affect team willingness

13. Clojure + Ring / Luminus

Compile-Time Error Detection

Score: ★

Error Feedback Clarity

Score: ★★

Type System

Score: ★

Concurrency Safety

Score: ★★★★★

Memory Safety

Score: ★★★★

Error Handling

Score: ★★

Testing Framework

Score: ★★★

Dependency Management

Score: ★★★

Third-Party Integration Coverage

Coverage: ~70%

Container Characteristics

Observability

Score: ★★★

Operational Stability

Score: ★★★

Ecosystem Completeness

Score: ★★

Horizontal Scalability

Score: ★★★

Type Safety Across Boundaries

Score: ★

Async/Concurrency Model

Score: ★★★★

Overall Agent-Suitability

Score: ★★

Best Use Cases

Avoid If

Key Risks

  1. LLM incompetence: Clojure is among the worst languages for LLM code generation
  2. Niche ecosystem: Limited libraries, small community, fewer maintained packages
  3. JVM overhead: Same cold start and memory concerns as Java

Comparative Analysis

Tier Rankings by Use Case

Tier 1 for Correctness (Compile-Time Guarantees)

Rank Framework Rationale
1 Rust + Axum Memory safety, data race prevention, exhaustive error handling - all at compile time
2 Scala + ZIO Typed effects track errors and dependencies in type signatures
3 Kotlin + Ktor Null safety at language level, sealed classes, structured concurrency
4 Go + Chi/Echo Explicit errors, simple type system, minimal footguns

Tier 1 for Integration Coverage (SDK Ecosystem)

Rank Framework Coverage
1 Node.js/TS + Fastify ~95% - virtually every platform has a TS/JS SDK
2 Java + Spring Boot ~90% - enterprise heritage means broad official SDK support
3 Python + FastAPI ~90% - data/ML ecosystem adds to web SDK coverage
4 C# + ASP.NET Core ~85% - strong Azure, good across the board

Tier 1 for Deployment Efficiency (Container Characteristics)

Rank Framework Image Size Startup Memory
1 Rust + Axum 5-20 MB 1-10 ms 5-30 MB
2 Go + Chi/Echo 10-30 MB 10-50 ms 10-50 MB
3 C# + ASP.NET (AOT) 30-80 MB 50-100 ms 30-100 MB
4 Elixir + Phoenix 30-80 MB 100-500 ms 30-100 MB

Tier 1 for Agent Iteration Speed (Error Feedback + LLM Familiarity)

Rank Framework First-Pass Rate Typical Iterations
1 Go + Chi/Echo 70-80% 1-3
2 Node.js/TS + Fastify 65-75% 2-4
3 Java + Spring Boot 65-75% 2-4
4 C# + ASP.NET Core 65-75% 2-4
5 Python + FastAPI 60-70% 3-5

Trade-Off Matrix

                    Correctness ←-> Iteration Speed
                    ┌─────────────────────────────────┐
          High      │ Rust        Scala               │
      Correctness   │   ←‘           ←‘                 │
                    │   Go    Kotlin  C#              │
                    │     ←‘     ←‘      ←‘              │
                    │      Java   Node/TS             │
                    │        ←‘      ←‘                 │
                    │   Elixir  Python  PHP           │
                    │     ←‘       ←‘      ←‘            │
          Low       │  Clojure  Ruby                  │
      Correctness   │                                 │
                    └─────────────────────────────────┘
                    Slow                          Fast
                    Iteration                 Iteration
                    Correctness ←-> Integration Coverage
                    ┌─────────────────────────────────┐
          High      │                     Node/TS     │
      Integration   │                  Java  Python   │
                    │               C#   PHP  Kotlin  │
                    │            Ruby     Go          │
                    │         Deno                    │
                    │      Scala                      │
          Low       │   Rust   Elixir  Clojure       │
      Integration   │                                 │
                    └─────────────────────────────────┘
                    Low                          High
                    Correctness           Correctness

Red Flag Summary

Framework Memory Safety Compile-Time Types Silent Failures Race Conditions Testing SDK >30% Clear Errors Stable API Mature (5yr+) Struct Logging Dist Tracing Image <500MB Startup <5s Graceful Shutdown
Node/TS + Fastify ⚠️ ⚠️
Python + FastAPI ❌ ⚠️ ⚠️
Go + Chi/Echo ⚠️ ⚠️
Rust + Axum ⚠️
Java + Spring Boot ⚠️ ⚠️ ⚠️ ⚠️
C# + ASP.NET ⚠️ ⚠️
Deno + Fresh ⚠️ ⚠️ ⚠️ ❌ ⚠️
Ruby + Rails ❌ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️
Elixir + Phoenix ❌ ⚠️ ⚠️
Kotlin + Ktor ⚠️ ⚠️ ⚠️
Scala + ZIO ⚠️ ❌ ⚠️ ⚠️ ⚠️
PHP + Laravel ❌ ⚠️ ✅* ⚠️ ⚠️
Clojure + Ring ❌ ⚠️ ❌ ⚠️ ⚠️ ⚠️

*PHP's shared-nothing architecture means races are structurally impossible within a request.

Legend: ✅ = passes, ⚠️ = conditional/partial, ❌ = fails

Frameworks with red flags:


Final Recommendations

1. Single Best Framework for Agent-Generated Web Applications

Go + Chi/Echo

Go wins on the combination that matters most for agent-generated code: high first-pass success rate, clear error messages, fast compilation, explicit error handling, tiny container images, and operational simplicity. It has the best ratio of correctness guarantees to iteration cost.

The type system is simpler than Rust's, which means LLMs write valid Go on the first attempt far more often. The explicit if err != nil pattern means agents handle errors by default. The compiler errors are the clearest of any evaluated language. Container images are 10-30 MB with sub-50ms startup.

The trade-off is SDK coverage (~80% vs Node's ~95%) and a less expressive type system. For Planifest, where the architecture is standardised and integrations are bounded by the Feature Brief, this trade-off is acceptable.

2. Best Framework by Use Case

Use Case Recommendation Runner-Up
Correctness-critical (payments, security) Rust + Axum Go + Chi
Integration-heavy (SaaS, CRM, multi-API) Node.js/TS + Fastify Java + Spring Boot
High-scale/efficiency (infrastructure, proxies) Go + Chi Rust + Axum
Operational longevity (10+ year lifespan) Java + Spring Boot Go + Chi
Rapid prototyping / MVP Node.js/TS + Fastify Python + FastAPI
Real-time / WebSockets Elixir + Phoenix Go + Chi
Data pipelines / ML Python + FastAPI Scala + ZIO

3. Polyglot Architecture Recommendation

For a complete Planifest-managed system with agent-generated microservices:

┌──────────────────────────────────────────────────────────┐
│                   Service Architecture                    │
├──────────────────────────────────────────────────────────┤
│                                                          │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐     │
│  │  Frontend    │  │  BFF / API  │  │  Integration │     │
│  │  React/TS    │  │  Gateway    │  │  Services    │     │
│  │  (Vite)      │  │  Go + Chi   │  │  Node/TS +   │     │
│  │              │  │             │  │  Fastify     │     │
│  └─────────────┘  └─────────────┘  └─────────────┘     │
│                          │                │              │
│                          â-¼                â-¼              │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐     │
│  │  Core Domain│  │  Security-  │  │  Data /      │     │
│  │  Services   │  │  Critical   │  │  Analytics   │     │
│  │  Go + Chi   │  │  Rust +     │  │  Python +    │     │
│  │             │  │  Axum       │  │  FastAPI     │     │
│  └─────────────┘  └─────────────┘  └─────────────┘     │
│                                                          │
│  Shared contracts: OpenAPI + protobuf                    │
│  Shared observability: OpenTelemetry -> DataDog/Grafana   │
│  Orchestration: Kubernetes / ECS Fargate                 │
└──────────────────────────────────────────────────────────┘
Layer Language Rationale
Frontend TypeScript + React Already specified in Planifest architecture. LLMs excel at React.
API Gateway / BFF Go + Chi Fast, tiny images, explicit errors, excellent for routing/middleware
Core domain services Go + Chi Best agent iteration speed with strong correctness. Default choice.
Integration services (3rd-party APIs) Node.js/TS + Fastify Maximum SDK coverage. Shared types with frontend via Zod.
Security-critical services (auth, payments) Rust + Axum Compile-time memory and concurrency safety. Worth the iteration cost for critical paths.
Data/analytics services Python + FastAPI Unmatched data science ecosystem. Pydantic for validation.

Cross-cutting:

4. Rationale - Why These Choices

Go as default backend:

Node/TS for integrations:

Rust for security-critical:

Python for data:

5. Trade-Offs

Choice You Gain You Lose
Go as default Iteration speed, deployment efficiency, error clarity Type system expressiveness, SDK breadth
Node/TS for integrations SDK coverage, type sharing with frontend Weak error handling, any escape hatch, larger images
Rust for security Compile-time correctness guarantees Iteration speed (5-10x more cycles), SDK coverage
Python for data Data science ecosystem Type safety, performance, container efficiency
Polyglot architecture Best tool for each job Operational complexity, more deployment configurations

6. Agent Success Probability

For a typical CRUD web service generated from an Feature Brief:

Stack First-Pass Compilation First-Pass Tests Pass Production-Ready After N Iterations
Go + Chi 80% 55% 2-3
Node/TS + Fastify 75% 50% 3-4
Java + Spring Boot 70% 50% 3-4
C# + ASP.NET Core 70% 50% 3-4
Kotlin + Ktor 65% 45% 3-5
Python + FastAPI 70% 45% 3-5
Rust + Axum 45% 35% 5-10
Elixir + Phoenix 50% 35% 5-7
PHP + Laravel 65% 45% 3-5
Ruby + Rails 60% 40% 4-6
Scala + ZIO 40% 25% 8-12
Clojure + Ring 35% 25% 8-10
Deno + Fresh 55% 40% 4-6

Answers to Success Criteria

Which framework produces the fewest bugs in agent-generated code? Rust + Axum - once it compiles. But Go + Chi produces the fewest bugs per unit of agent time, which is the metric that matters for throughput.

Which framework has the best error messages for LLM iteration? Go. Terse, exact, single-line, actionable. No cascading errors, no template noise.

Which framework has the best integration coverage? Node.js/TypeScript + Fastify. ~95% of common platforms have official SDKs.

Which framework scales best across Kubernetes? Go. Smallest images, fastest startup, lowest memory, designed for the cloud-native ecosystem.

Which would you choose for a payment system? Rust + Axum. Compile-time memory and concurrency safety. The iteration cost is justified by the risk reduction.

Which would you choose for a real-time streaming service? Elixir + Phoenix for connection management, Go for throughput-critical processing.

Which would you choose for a SaaS CRM application? Node.js/TypeScript + Fastify. Maximum SDK coverage for CRM, email, analytics, and payment integrations.

Which frameworks should be combined in a microservices system? Go (default) + Node/TS (integrations) + Rust (security-critical) + Python (data). See polyglot recommendation above.

For a completely new web application built entirely from agent-generated code, which would you choose? Go + Chi for the backend, React + TypeScript for the frontend. Go provides the best balance of agent success rate, compile-time safety, deployment efficiency, and operational stability. The trade-off in SDK coverage is manageable via OpenAPI-generated HTTP clients when needed.


Implications for Planifest

Planifest does not specify a stack - stack is a requirement declared per feature, not a framework default (see FD-015). The confirmed design pilot uses TypeScript/Node.js + Fastify for the backend. This is a defensible choice for the pilot for the following reasons:

  1. Single-language stack (TS everywhere) eliminates context-switching for the codegen-agent
  2. Maximum SDK coverage for integration-heavy services
  3. Shared Zod schemas between frontend and backend enforce contracts
  4. LLM fluency in TypeScript is the highest of any language

However, future features should consider the findings of this evaluation when declaring their stack:

  1. Go for core domain services where deployment efficiency, error clarity, and first-pass success rate matter more than SDK coverage
  2. Rust for security-critical services (auth, payment processing) where compile-time guarantees justify the higher iteration cost
  3. Polyglot architectures where different components have genuinely different requirements - each choice justified by an ADR
  4. If using TypeScript, enforce strict mode (strict: true, noUncheckedIndexedAccess, ban any via ESLint) and consider neverthrow or similar Result-type libraries to mitigate the type system's weaknesses

The orchestrator agent should draw human attention to this document during the stack coaching conversation. The human decides - but with the evidence.