Skip to main content
Supersedes 0011. Every row change that earlier ADRs made to the 0011 table is collected here, so the table has one source again. The rows that changed are named in Decision.

Context

0011 is the one table of rejected and deferred technologies. Since it was written, waves 1 to 3 added or changed rows in separate ADRs: the Encore row (0124), the runtime schema engine (0110, 0154), the delegation row (0193), and others. A reader had to read sixteen ADRs to learn one row. The owner’s answers also added rows that the table never held (Better Auth, Storybook, GraphQL and others).

Decision

  1. One table. The table below replaces the 0011 table. Do not introduce anything in the Not introduced column. If a task seems to need one, stop and route to the owner. Rejected means no. Deferred means not yet, and the trigger names when. A row changes only by a new ADR.
  2. Rows changed.
    • The Encore row is the hand-written form only: encore.dev and ~encore/* in service members are rejected, and Encore is the generated target in .stackra/encore (0091, 0124).
    • The delegation row is removed. Agents run by tier under 0193.
    • The AI gateway row is reworded. An LLM proxy gateway in front of model providers stays rejected. One MCP gateway in the ai service is allowed (0155).
    • The search row: OpenSearch is built on a measured trigger (0221).
    • The authorization row: the OpenFGA and OPA adapters come later, behind the policy decision point (0208).
    • The shared component row: the replacement is the @stackra/ui contract (0165).
    • The observability row points to 0184.
    • The runtime schema engine row adds the allowed forms that later ADRs record: tenant content types (0226), tenant automations (0153), and pricing blocks with no expressions (0219).
  3. Rows added. Better Auth, change-data-capture, XState, Storybook, GraphQL, hand-written gRPC, the Kafka/NATS/Redpanda bus drivers, and the deferred platform items: a vector store, a graph database, an OLAP engine, sharding, a second non-TypeScript runtime. Active-active across regions is rejected (0186).

Table

Consequences

  • A proposal that touches one of these rows starts with a new ADR, not a pull request.
  • Product-specific rejections (billing vendors, wallet design and similar) are not carried here; a product repository records its own.
  • The Temporal driver stays as the Pro driver (0151); this table does not list it.

Enforcement

  • FORBIDDEN_DEPENDENCIES in tools/scripts/validate-repository.mjs fails a member that lists eslint, prettier, jest, @nestjs/core, @nestjs/common, reflect-metadata, prisma, @prisma/client, drizzle-orm, express, fastify, typeorm or knex.
  • packages/tooling/oxlint/src/boundaries.jsonc bans encore.dev in packages.
  • planned — extend FORBIDDEN_DEPENDENCIES with next, better-auth, xstate, @storybook/* and graphql, the rows this table adds.
  • The architecture-guardian agent reads this page.

Alternatives

  • Leave the scattered row changes in their own ADRs and keep 0011 as it is. Rejected, because a reader would need sixteen ADRs to learn one row.

Supersedes and sources

Supersedes: 0011. Sources: the wave 4 entry for 0227 in the decision register (gap B18, row changes C-24 and the 0193 delegation row); owner answers on Next.js, Better Auth and the identity provider (stackra-decisions-2026-10-19.md, 2026-10-20).