7.0 KiB
25 — Implementation defaults and decision boundaries
Purpose
This document removes routine ambiguity for autonomous implementation. Codex may choose compatible current stable versions, but it should not substitute a materially different architecture without recording an ADR and proving that all acceptance criteria remain satisfied.
Workspace and package management
Use a TypeScript monorepo with pnpm workspaces.
Recommended layout:
apps/
web/ Next.js application and HTTP API
worker/ PostgreSQL-backed background worker
packages/
domain/ entities, value objects and policy rules
application/ use cases and ports
db/ schema, migrations and repositories
content/ package loading, schemas and registry services
composer/ condition evaluation, policy resolution, rendering and lint
integrations/ forge adapters and encrypted-secret services
config/ typed environment and instance configuration
observability/ logs, metrics and audit helpers
ui/ shared accessible components and design tokens
testing/ fixtures and test utilities
content/playbooks/ canonical built-in Playbook Packages
Turborepo is the default task orchestrator. Remote caching must remain disabled and unnecessary for local or self-hosted builds unless an operator explicitly configures it later.
The exact root commands and bootstrap file contract are defined in docs/40-bootstrap-repository-contract.md.
Application stack
- Next.js App Router and strict TypeScript.
- React Server Components for read-heavy pages where practical.
- Client components only for interactive composer, editors, command palette and visualizations.
- PostgreSQL as the only required data service.
- A typed SQL/ORM layer with explicit migrations; Drizzle is the preferred default unless compatibility testing identifies a blocker.
- Zod or an equivalent runtime schema layer at every external boundary.
- YAML parsing in safe mode with aliases and resource expansion bounded.
- A restricted template engine with strict missing-variable behavior and no arbitrary helpers or code execution.
- Vitest for unit and integration-oriented TypeScript tests.
- Playwright for browser flows and accessibility-oriented interaction checks.
- Structured JSON logging through a maintained logger such as Pino.
UI foundations
- Tailwind CSS for tokens and layout utilities.
- An accessible headless component foundation; shadcn/ui may be used as a starting point but copied components become application-owned code.
- React Hook Form or equivalent for complex composer forms.
- Monaco or CodeMirror only inside Prompt Lab; normal prompt previews use lighter read-only rendering.
- Mermaid diagrams in documentation only. Runtime topology should use an accessible application-owned graph implementation, not raw Mermaid execution from untrusted content.
API and contracts
- JSON REST API under
/api/v1. - Runtime routes and the checked-in OpenAPI contract must be generated from or tested against one source of truth.
- Cursor pagination for potentially unbounded resources.
- Idempotency keys for final generation, imports and retryable write actions.
- RFC 3339 UTC timestamps in APIs and storage.
- UUIDv7 or another sortable opaque identifier may be used consistently; do not expose sequential database IDs.
Authentication decision boundary
Use Better Auth as the preferred implementation, integrated with Next.js and the selected Drizzle/PostgreSQL layer. Configure local email/password credentials and database-backed revocable sessions. Verify the current stable version, migration behavior, cookie/CSRF model and password-reset hooks during Milestone 0. A different maintained library requires a blocker-level ADR with compatibility and security evidence. Do not implement home-grown cryptography or session signing. The product-level behavior in docs/26-authentication-authorization.md remains mandatory regardless of library.
Background jobs
Use a PostgreSQL job table and worker process.
- Claim work using transactions and
FOR UPDATE SKIP LOCKEDor an equivalent safe lease mechanism. - Every job has an idempotency key or a domain-specific duplicate-prevention rule.
- A worker restart must release or eventually expire leases.
- Retry only classified transient failures with bounded exponential backoff and jitter.
- Permanent validation or authorization failures are not retried automatically.
- Redis and an external queue are prohibited in the MVP.
Search
Start with PostgreSQL full-text search and ordinary indexed facets.
- Store a normalized search document per published playbook version.
- Use trigram matching only when the extension is available and measured useful.
- Do not add embeddings or a vector database until a recorded search-quality evaluation proves a need.
Files and artifacts
- Built-in content is read-only at runtime and imported into PostgreSQL idempotently.
- Private draft content is stored in PostgreSQL and exported to files for Git review.
- Binary artifacts use opaque storage keys beneath the configured artifact root.
- No user-provided path may become a direct filesystem path.
- Local-disk storage is the MVP adapter; an S3-compatible adapter is future work.
Encryption
Integration secrets use authenticated encryption with a 256-bit key supplied outside the database. AES-256-GCM is the default reference design.
Stored envelope fields:
- format version;
- key version;
- nonce;
- ciphertext;
- authentication tag;
- optional associated-data version.
Associated data must bind the ciphertext to integration ID, workspace ID and secret kind. Never reuse a nonce with the same key.
Content rendering
- Condition evaluation uses the declarative AST in
docs/28-conditions-and-policy-dsl.md. - Templates receive only allowlisted normalized values.
- Missing required variables are blocking errors.
- Arrays and key/value inputs use platform-owned deterministic Markdown renderers.
- Repository evidence cannot be interpreted as template source.
- Canonicalization follows
docs/29-package-integrity-canonicalization.md.
Dependency policy
- Pin exact dependency versions in the lockfile.
- Use current stable versions verified for mutual compatibility during Milestone 0.
- Avoid dependencies whose core function can be implemented safely in a small application-owned module.
- Record any dependency that processes untrusted archives, Markdown, YAML, templates, authentication or cryptography in the security review.
- Configure automated dependency and license scanning in CI.
Disallowed shortcuts
- No SQLite fallback hidden in production.
- No in-memory persistence outside tests and explicit demo fixtures.
- No mocked Gitea responses in production code paths.
- No
eval,Function, shell execution or dynamic module loading for conditions or templates. - No direct code execution, repository checkout or Codex invocation in the MVP.
- No silent creation of default administrator credentials.