agentleFS
kai-schedulerkai-scheduler/KAI-Scheduler/AGENTS.md

KAI-Scheduler

AGENTS.md1.6k starsChanged 3 months agoApache-2.0View on GitHub

KAI Scheduler is a Kubernetes scheduler optimized for GPU resource allocation in AI/ML workloads, built on kube-batch with a modular plugin architecture. E2E tests run against a real Kubernetes using kind cluster and are located in test/e2e/suites/.

1 other project uses a version of this.

Trending

More talk lately.about the whole repository

Dec 2025: 0 mentionsJan 2026: 0 mentionsFeb 2026: 0 mentionsMar 2026: 2 mentionsApr 2026: 1 mentionMay 2026: 1 mentionJun 2026: 3 mentionsJul 2026: 0 mentionsAug 2026: 2 mentionsSep 2026: 4 mentionsOct 2026: 13 mentionsNov 2026: 2 mentions
Dec 2025Jun 2026Nov 2026
Mentions a month of the kai-scheduler/KAI-Scheduler repository that our weekly crawl found. There is no adoption data for this file yet.

Most recently taken up by

Who's talking about kai-scheduler/KAI-Scheduler

The biggest 5 of 28 mentions linking to the repository that our crawl found. Each line is their own headline.

See all 28

Talked about on GitHub (28 times).

On GitHub · 28

23 more on GitHub
  • Other versions1 project uses a version of this.

    Word for word · 1

    1. NVIDIA/KAI-Scheduler★ 1.6k100% same

    Edited · 0

    None found.

    Wrote their own version · 0

    None found.

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

  • Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.

    Of the AGENTS.md files we read, the 31,439 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.

  • In this repository2 other files it gives its agents.

The file

Show its rules and text

We split this AGENTS.md into the rules it gives an agent

15 rules. About 0 are common, 9 are distinctive, and 6 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈9

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 6

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Test files MUST ALWAYS be in the same directory as code

    line 23
  2. Very specific:

    Test files names MUST ALWAYS end in _test.go.

    line 24
  3. Distinctive:

    Follow the logging practices in CONTRIBUTING.md.

    line 121
  4. Distinctive:

    DO NOT wrire obvious comments.

    line 127
  5. Distinctive:

    Keep comments short, concise and to the point.

    line 128
  6. Very specific:

    Use defer for cleanup and state restoration

    line 135
  7. Very specific:

    Test files (*_test.go) have relaxed rules for goconst, errcheck, govet.

    line 142
  8. Very specific:

    When opening a PR, use the template in .github/pull_request_template.md for the PR description

    line 155
  9. Distinctive:

    Commit the fragment with your code.

    line 177
  10. Distinctive:

    Use git mv when moving files to preserve history

    line 196
  11. Distinctive:

    DO NOT add obvious comments that duplicate the code.

    line 197
  12. Distinctive:

    Write comments ONLY when ABSOLUTELY necessary

    line 198
  13. Distinctive:

    Keep Comments short, explicit and concise

    line 199
  14. Very specific:

    DO NOT use I, we or any other pronoun

    line 200
  15. Very specific:

    When performing a major change, run make validate after changes

    line 201

≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
AGENTS.md

KAI Scheduler - Agent Development Guide

KAI Scheduler is a Kubernetes scheduler optimized for GPU resource allocation in AI/ML workloads, built on kube-batch with a modular plugin architecture.

Build/Lint/Test Commands

Building

make build                    # Build all services (Docker-based)
make build-go SERVICE_NAME=scheduler  # Build single service

Linting

make lint                     # Run all linters (fmt, vet, golangci-lint)
make fmt-go                   # Format Go code
make vet-go                   # Run go vet

Testing

unit and integration tests

  • Test files MUST ALWAYS be in the same directory as code
  • Test files names MUST ALWAYS end in _test.go. Example: resolver_test.go
make test                     # Run all tests (unit + helm chart tests)

# Run a single test file
ginkgo -v ./pkg/scheduler/actions/allocate

# Run a specific test function
ginkgo -v --focus "TestHandleAllocation" ./pkg/scheduler/actions/allocate

# Run tests with Ginkgo (for integration tests)
ginkgo -v --focus "test name pattern" ./pkg/binder/controllers/integration_tests

# Run tests with envtest (requires setup-envtest)
make envtest
KUBEBUILDER_ASSETS="$(bin/setup-envtest use 1.34.0 -p path --bin-dir bin)" go test ./pkg/... -timeout 30m

E2E tests

E2E tests run against a real Kubernetes using kind cluster and are located in test/e2e/suites/.

# Run locally with Kind (recommended for development)
./hack/run-e2e-kind.sh                          # Full e2e suite
./hack/run-e2e-kind.sh --preserve-cluster       # Keep cluster after tests
./hack/run-e2e-kind.sh --local-images-build     # Build images locally

# Run specific test suites (requires cluster with KAI installed)
ginkgo -r --randomize-all ./test/e2e/suites/allocate
ginkgo -r --randomize-all --focus "quota" ./test/e2e/suites

# Run with verbose output and trace
ginkgo -r --randomize-all --trace -vv ./test/e2e/suites/preempt

Code Generation

make manifests                # Generate RBAC
make generate-mocks           # Generate mock implementations
make validate                 # Verify generated code is up to date. Also format and vet codebase

Repository Structure

Core Services (/cmd/ and /pkg/)

  • scheduler - Core GPU-aware batch scheduler with plugins, actions, and cache
  • binder - Pod binding execution with GPU sharing support
  • operator - Lifecycle management of all KAI components
  • podgrouper - PodGroup creation from workloads (Kubeflow, Spark, Ray, etc.)
  • admission - Validating/mutating webhooks for KAI resources
  • queuecontroller - Queue resource management and status updates
  • podgroupcontroller - PodGroup lifecycle and status management
  • resourcereservation - GPU resource reservation for pending pods
  • nodescaleadjuster - Node scaling integration for autoscalers

Supporting Packages (/pkg/)

  • common - Shared utilities (k8s utils, feature gates, flags)

API types

CRD types (Queue, PodGroup, BindRequest, Config, SchedulingShard, ...), generated clients, shared constants and resource/podgroup helpers live in the separate module github.com/kai-scheduler/api, not in this repo. API/CRD changes start with a PR there; after a tag is cut, bump it in go.mod.

Tools (/cmd/)

  • fairshare-simulator - Simulate fairshare scheduling decisions
  • time-based-fairshare-simulator - Time-based scheduling simulation
  • snapshot-tool - Cluster state snapshot utilities
  • scalingpod - Helper for scaling pod operations

Code Style Guidelines

Import Organization

Organize imports in three groups separated by blank lines:

import (
    // 1. Standard library
    "context"
    "fmt"

    // 2. External dependencies
    v1 "k8s.io/api/core/v1"
    "sigs.k8s.io/controller-runtime/pkg/client"

    // 3. Internal packages
    "github.com/kai-scheduler/KAI-scheduler/pkg/scheduler/api"
)

Naming Conventions

  • Files: snake_case (bind_request_controller.go, node_info.go)
  • Types: PascalCase (SchedulerCache, NodeInfo)
  • Interfaces: -er suffix or Interface (Plugin, SchedulerLogger)
  • Functions: PascalCase exported, camelCase unexported
  • Boolean functions: is/has/should prefix (IsTaskAllocatable)
  • Constants: PascalCase exported, camelCase unexported

Logging

Follow the logging practices in CONTRIBUTING.md.

Comments

  • Apache 2.0 + NVIDIA copyright headers on all files
  • GoDoc-style for exported functions/types
  • kubebuilder RBAC markers: // +kubebuilder:rbac:groups=core,resources=pods,verbs=get
  • DO NOT wrire obvious comments; explain "why" not "what"
  • Keep comments short, concise and to the point.

General Patterns

  • Context as first parameter: func Foo(ctx context.Context, ...)
  • Pointer receivers for methods that modify state
  • Interfaces in interface.go files
  • Constructor functions return interface types: func New(...) Cache
  • Use defer for cleanup and state restoration

Linter Configuration

Enabled linters (see .golangci.yaml):

  • gofmt unused goconst errcheck govet

Test files (*_test.go) have relaxed rules for goconst, errcheck, govet.

Pull Request Requirements

PR Title Format (Conventional Commits)

PR titles must follow conventional commit format: <type>(<scope>): <description>

Types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert

Scopes (optional): scheduler, binder, podgrouper, admission, operator, queue-controller, pod-group-controller, resource-reservation, chart, api, node-scale-adjuster, ci, release, docs, deps

PR Description format

When opening a PR, use the template in .github/pull_request_template.md for the PR description

Changelog Requirements

Changelog entries are changie fragments. Never edit CHANGELOG.md directly — it is the source of truth for released versions and is only written at release time. Never write fragment files by hand — always use make changelog.

# Add a fragment (non-interactive — required for agents)
# AUTHOR is the GitHub username to credit; ISSUE is the PR/issue number. Both required.
make changelog KIND=<kind> BODY="short description under 20 words" AUTHOR="<github-user>" ISSUE="<pr-or-issue-number>"

# Valid kinds: Added | Changed | Fixed | Removed
make changelog KIND=Fixed  BODY="Scheduler exits on 401 instead of retrying indefinitely" AUTHOR="SomeUsername" ISSUE="1817"
make changelog KIND=Added  BODY="Helm value to disable resource-reservation namespace creation" AUTHOR="SomeUsername" ISSUE="1820"

# Preview the next release section (optional)
make changelog-preview VERSION=v0.17.0
  • Add a fragment on every PR that changes behavior (adds functionality, fixes a bug, changes an API, or gives a significant perf win). Skip it for refactors, docs, tests, and CI changes — apply the skip-changelog (or dependencies) label instead. CI fails a behavior PR that has neither.
  • Entries MUST be fewer than 20 words. Keep them clear and concise.
  • Always set AUTHOR (the PR author's GitHub username) and ISSUE (the PR number, or a linked issue number if one exists) — omitting them drops attribution and traceability from CHANGELOG.md. If the PR number isn't known yet, use the issue number; update the fragment once the PR is opened.
  • Commit the fragment with your code. Fragments never conflict between PRs or backports, so no coordination is needed.

Humans: make changelog with no args runs the interactive prompts.

Releasing (maintainers): don't fold the changelog by hand. Dispatch the Release — Prepare Changelog workflow with a version (e.g. v0.17.0) from the target branch — main for a minor/major, a v*.* branch for a patch. It folds the pending fragments into CHANGELOG.md, clears them, and opens a PR. Merging that PR auto-tags the version and publishes the GitHub Release.

Sub-chart versions: the chart declares gpu-fractioning as a version range (~0.1.0) rather than an exact pin, so a gpu-fractioning patch is picked up by the next chart build instead of needing a PR here. deployments/kai-scheduler/Chart.lock is therefore not tracked — it is local build output. helm dependency build resolves the range by itself when no lock is present, so every call site stays as it is.

Two things follow:

  • A leftover local Chart.lock freezes you. Once a build writes one, later builds install that version and never re-check the registry. Run rm -f deployments/kai-scheduler/Chart.lock to pick up a newer gpu-fractioning. CI is unaffected — a fresh checkout never has one.
  • Which version shipped is recorded on the release, not in git: the subcharts.yaml asset on the GitHub Release. Release — Prepare Changelog also adds a changelog entry by itself when the version moves, but that entry names no version — the changelog is written before the chart is built, so any version in it could be stale by then. subcharts.yaml is the only authoritative record.

CI Checks (on-pr.yaml)

PRs trigger: make validate → make test → make build → E2E tests

  • Docs-only changes (.md files, docs/) skip build/test
  • E2E tests run with Ginkgo: ginkgo -r --randomize-all ./test/e2e/suites

General Rules

  • Use git mv when moving files to preserve history
  • DO NOT add obvious comments that duplicate the code.
    • Write comments ONLY when ABSOLUTELY necessary
    • Keep Comments short, explicit and concise
    • DO NOT use I, we or any other pronoun
  • When performing a major change, run make validate after changes

Philosophy & Design

  • Documentation can be found in docs folder
  • Design documents for major features are in docs/developer/designs/:
  • Usage Examples are in examples

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.