New Features in git11

git11 is an AI workspace for engineering teams. It understands repositories, auto-generates documentation, answers deep code questions, and works securely across your GitHub organization.

✦ AI Documentation for any repository

✦ Ask anything about your codebase

✦ Organization & team access with permissions

✦ Secure GitHub App integration with audit logs

git11 repository intelligence dashboard

Anatomy of a Modern Production Repository

High-performance software organizations treat the repository as a deterministic engine rather than a file store.

By git11 Engineering · Mon Apr 06 2026 · 7 min read

Anatomy of a Modern Production Repository

A production repository is no longer a collection of source files. It is an automated factory that validates, builds, and deploys every commit in under ten minutes. Most teams fail because they optimize for developer convenience rather than system reliability.

Industrial-grade repositories share three characteristics. They enforce strict boundaries between code and configuration. They automate every step of the lifecycle. They fail loudly and early.

Repository Root Architecture

The root directory defines the project culture. A cluttered root suggests a lack of discipline. A clean root directs the developer exactly where they need to go. Modern standards prioritize a few critical paths.

  • /src contains the primary application logic.
  • /tests houses integration and end-to-end suites.
  • /.github dictates the operational flow via GitHub Actions.
  • /scripts or /tools contains necessary operational glue.

Keep the root clean. Configuration files like tsconfig.json, package.json, or pyproject.toml belong there. Documentation must be in /docs or a README.md. Do not let temporary files or logs pollute this space.

Strict Type Systems

Runtime errors are failures of the engineering process. Production repositories use static analysis to eliminate entire classes of bugs. We see this most clearly in TypeScript or Go environments where strictness is a requirement, not a suggestion.

In TypeScript, we enable strict: true and noImplicitAny: true. We treat warnings as errors. If the code does not pass the type checker, the build system rejects it. This prevents the shipment of undefined values to production.

  1. Install the language-specific linter. 2.

Configure a pre-commit hook via husky or pre-commit. 3. Block the merge if the linter fails.

The GitHub Actions Engine

GitHub Actions is the nervous system of the repository. A modern .github/workflows directory contains multiple specialized YAML files. We separate concerns between unit tests, deployments, and security scanning.

Avoid giant monolithic workflow files. Create a ci.yml for pull requests and a deploy.yml for the main branch. Use required_status_checks in your branch protection rules. No human should have the power to bypass these checks.

Every commit must trigger a suite of tests. This suite includes unit tests for logic and integration tests for external dependencies. Use services in GitHub Actions to spin up temporary postgres or redis instances for your tests.

Dependency Management

Unmanaged dependencies are a primary source of production outages. We use lockfiles to ensure every environment runs the exact same code. package-lock.json, pnpm-lock.yaml, or go.sum are mandatory requirements.

We track security vulnerabilities using dependabot or snyk. These tools scan your dependencies and open pull requests for outdated packages. Set dependabot to run daily. Review the changelogs before merging.

  • Pin versions of critical infrastructure tools.
  • Avoid using "latest" tags in Docker files or GitHub Actions.
  • Use a private registry if you rely on internal packages.

Infrastucture as Code

Production repositories contain the infrastructure they run on. We store Terraform files or Kubernetes manifests alongside the application code. This practice ensures the infrastructure evolves with the software.

Place these files in a /terraform or /infra directory. Use a state management backend like S3 or Terraform Cloud. This allows any engineer with the right permissions to recreate the environment from scratch.

When we change a database schema, the migration file exists in the same commit as the code that uses it. We use tools like prisma, alembic, or go-migrate. This prevents the "code-ahead-of-database" problem during deployment.

Standardized Scripting

Do not expect developers to remember complex CLI flags. Every repository needs a standard entry point for common tasks. We use a Makefile or a justfile to provide these shortcuts.

  • make build compiles the application.
  • make test runs the full test suite.
  • make lint checks code style.
  • make dev starts the local development environment.

These scripts must work identically on a developer's laptop and in the CI environment. If make test passes locally but fails in CI, your environment isolation is broken. Fix the containerization, not the test.

Observability and Metadata

A modern repository includes its own monitoring definitions. We store Prometheus alerts and Grafana dashboards as code. When a service moves to a new repository, its observability stack moves with it.

  • Define SLOs in a YAML file.
  • Include a CODEOWNERS file to route alerts to the right team.
  • Keep a CHANGELOG.md updated via automated tooling like standard-version.

Documentation is as important as code. Every feature needs a corresponding entry in /docs. We use Markdown for everything so it stays searchable within GitHub.

Automated Security Posture

Security is a continuous process. We use Static Application Security Testing (SAST) tools in the CI pipeline. Tools like semgrep or codeql scan for common vulnerabilities like SQL injection or hardcoded secrets.

  1. Run secret-stack or trufflehog to detect leaked keys. 2. Use GitHub’s environment secrets for production credentials.
  1. Rotate keys every 90 days.

Never store .env files in the repository. Use .env.example to show which keys are required. The CI system injects real values at runtime through the environment.

Testing Strategy

We follow the testing pyramid. 70% of tests are unit tests. 20% are integration tests. 10% are end-to-end tests. Higher-level tests are slower and more brittle, so we use them sparingly.

Use codecov or a similar tool to track coverage. We do not aim for 100% coverage, as that often leads to low-quality tests. We aim for 80% coverage on critical business logic and 0% on boilerplate code.

  • Mock external APIs during unit tests.
  • Use real databases for integration tests.
  • Run end-to-end tests against a staging environment before production.

Meaningful Git History

The git log is a project's permanent record. We enforce conventional commits. Every message starts with a prefix like feat:, fix:, or chore:. This allows us to generate release notes automatically.

Squash merge pull requests to keep the main branch history linear. This makes git bisect effective when searching for a regression. A cluttered history of "work in progress" commits makes debugging impossible.

  • Keep pull requests small (under 400 lines).
  • Require at least one peer review.
  • Link every PR to an issue or a user story.

Docker and Containerization

If it runs in production, it runs in a container. The Dockerfile is the most important configuration file in the repository. It must be optimized for build speed and security.

Use multi-stage builds. The first stage handles the compilation and testing. The second stage only contains the production binary and its minimal runtime. This reduces the attack surface and the image size.

  • Use a specific base image tag like node:20.10-alpine.
  • Run the process as a non-root user.
  • Order layers to maximize cache hits.

Error Handling Patterns

Production repositories standardize how they fail. We use structured logging for every meaningful event. Logs are JSON objects, not strings. This allows tools like Datadog or ELK to index them correctly.

  • Every log entry must include a request_id or trace_id.
  • Log levels must be used correctly: ERROR for action-required items, INFO for flow.
  • Avoid logging sensitive data like passwords or PII.

We use a global error handler. In a web service, this ensures every failed request returns a consistent JSON error body. In a CLI, it ensures a non-zero exit code.

The README Standard

The README.md is the front door. It must answer three questions: what does this do, how do I run it, and how do I contribute. Do not include internal architecture details that change frequently. Link to the /docs folder instead.

Include a status badge for the CI build. This provides an immediate visual indicator of the repository's health. If the badge is red, the repository is broken.

Build the repository as a machine that produces reliable software.

Ask this question directly on your own repo →