Contributors

Get on the board.

A quick orientation for contributors. Start with one rule, one engine, or one workflow improvement while keeping the responsibility boundary clear.

Contributor guide: This page is a quick orientation. For development setup, testing, contribution workflow, and detailed contribution guidance, use CONTRIBUTING.md.
First rule

Classify by responsibility, not by field.

CHANGE STATE       ─────────► Optimizer
DETECT PROBLEM     ─────────► Validator
DETECT SECURITY RISK ───────► Security

Workflow order is separate from module ownership.

A rule looking at CPU, memory, probes, labels, or another field does not determine which engine owns it. What the rule is responsible for does.

Before you code

Choose the smallest correct boundary.

1. Add a rule

Ask: am I changing state, detecting a general problem, or detecting a security risk?

2. Keep it local

The rule should remain self-contained and avoid depending on another rule's internal result.

3. Compose by workflow

Do not move responsibility between engines just because a workflow runs one before another.

Architecture in one picture

Modules stay independent; workflows connect them.

Engine A
↔
Shared IR
↔
Engine B

The connection is provided by workflow composition. An engine does not need to become aware of every other engine.

Where an engine runs is a workflow concern too. The experimental remote example invokes the same engines through HTTP clients (koss remote) without changing what each one is responsible for. A new resource type needs serialization support in kostral/adapters/remote/client.py before it can pass through the remote adapter.

Where to read next

If you want to...Read
Understand the conceptual modelsystem-model.md
Understand engine/IR boundariesarchitecture.md
Understand protected behaviorguarantees.md
Understand remote engine invocationremote-engines.md
Start codingGitHub repository