Agentic Coding Adoption

Adopting agentic coding with tooling, prompts, and review practices.

Agentic Coding Adoption

We adopt agentic coding (AI-assisted development) in a structured way: tooling, prompts, and review practices so the whole team benefits consistently.

Agentic Coding Adoption

We adopt agentic coding in a structured way: shared tooling, prompts, and review practices so the whole team benefits consistently.

ToolingCursor, Copilot, shared configs
PromptsSnippets and conventions
ReviewConsistent quality checks

Tooling

Cursor, Copilot, or equivalent, with shared configs and conventions. Everyone uses the same baseline so we can share tips and debug issues.

Example: we keep a shared snippet for “new component” so AI gets the same imports and structure:

// Our standard component shell (shared in team docs)
import { cn } from '@/lib/cn';

interface Props {
  className?: string;
}

export function ComponentName({ className }: Props) {
  return <div className={cn('base-styles', className)} />;
}

Prompts

Reusable prompt patterns and examples (see Talent Prompting with MasterFabric) so the team gets consistent, high-quality assistance. We iterate on prompts and document what works.

Review: same bar for AI output

All code is reviewed; AI-generated code is held to the same standards as human-written code. We treat AI as a pair programmer, not a replacement for judgment.

Checklist for AI-assisted PRs

When reviewing code that was generated or heavily edited by AI, we still check:

  • Correctness — Logic and edge cases; tests if applicable.
  • Security — No hardcoded secrets, safe handling of inputs.
  • Style — Matches our lint rules and naming conventions.
  • Dependencies — No unnecessary or outdated packages.
  • Documentation — Non-obvious behavior is explained.

Good vs poor AI-assisted code

Clear, testable, and aligned with our style:

// Validates and normalizes; single responsibility
export function parsePageSize(input: unknown): number {
  const n = Number(input);
  if (!Number.isFinite(n) || n < 1 || n > 100) {
    throw new Error('pageSize must be a number between 1 and 100');
  }
  return Math.floor(n);
}
  • Single responsibility, explicit contract, throws on invalid input.
  • Easy to unit test and to reason about in reviews.

Vague, untestable, or inconsistent:

// What is the contract? What if input is null?
function parsePageSize(input: any) {
  return Math.max(1, Math.min(100, parseInt(input) || 10));
}
  • any hides types; parseInt behavior with null/undefined can surprise.
  • Silent coercion (e.g. null → 10) can hide bugs. We prefer explicit validation and clear errors.

We don’t accept “AI wrote it” as an excuse for unclear or unsafe code. Refine the prompt or edit the output until it meets the bar.

Human in the loop

We keep a human in the loop for design decisions, security-sensitive changes, and production deployments.

See also