---
title: One set of rules for every agent on a project
description: Write your rules once in a Hamloy project's settings, and every agent on it gets them, in any repo or none. Tried on a kiln controller with Claude Code.
url: https://hamloy.com/blog/one-set-of-rules-for-every-agent
---

[Blog](https://hamloy.com/blog)

# One set of rules for every agent on a project

Write your rules once in a Hamloy project's settings, and every agent on it gets them, in any repo or none. Tried on a kiln controller with Claude Code.

17 October 2026 · Rahmakyan

`CLAUDE.md` and `AGENTS.md` hold the rules for one repo, for the agents that read them. A Hamloy project now has a place for rules of your own, and every agent on the project gets them. That's Claude Code and Codex in any of its repos, and Claude or ChatGPT in a browser, which have no repo at all. You write them once, on the project's Settings page, and change them there.

Here they are on a test project, with Claude Code and Codex on a local Hamloy server. The replies are word for word.

## Two rules on the board, no file in the repo

Kiln is a controller for a small pottery kiln. Its repo holds an `app/` folder for the display and a `firmware/` folder for the code that runs on the kiln itself. It has no `CLAUDE.md`. Under **Instructions for assistants** , the project's settings said:

```
Before you tick a task, add a note saying how you checked it.
Don't change anything under firmware/: that code is flashed to the kiln by hand.
Add a request for me instead, with the exact change.
```

Claude Code (Haiku) got one prompt:

```
> Two fixes, please. The display spells Temperature wrong. And the kiln should hold
  at peak for 15 minutes, not 10. Keep track of it in Hamloy.
```

## Claude Code stayed out of firmware/ from its first search

Its first step was a search of the repo, and it already left the firmware out:

```
Grep(pattern: "Temperature|Tempurature|Temprature|hold|peak", glob: "!firmware/**")
```

That was before it had called Hamloy at all. Connected to the project's own address, it had the rules with Hamloy's server instructions, from the start.

It fixed `app/display.py`, then ticked the task with a note on how it checked:

```
tick(key: "B-xmnr@1", note: "Changed app/display.py status_line to \"Temperature\".
  Checked by reading the file back (it prints \"Temperature: ... min left\") and grepping
  the repo (excluding .git): no \"Temprature\" remains.")
```

## The change it couldn't make became a request

The hold time is `#define HOLD_MINUTES 10` in `firmware/timer.c`. Claude Code left the file as it was and added a request for the person:

```
○ R-n2m2@1 request
Kiln: Change peak hold from 10 to 15 minutes in firmware/timer.c
Waiting for you · added by claude on 2026-10-17

Notes
  firmware/timer.c, line 2: change
    #define HOLD_MINUTES 10
  to
    #define HOLD_MINUTES 15
  Then reflash the kiln by hand. Claude did not touch firmware/ per the project rule.
```

It said so at the end, too:

> **Peak hold (10 → 15 minutes): not changed.** The value is `#define HOLD_MINUTES 10` in `firmware/timer.c`, and the project rule says firmware is flashed by hand, so I left it alone. I added a request for you in Hamloy as R-n2m2.

The request waits on For you with the exact edit, so the change that needs your hands is in front of you, not lost in a terminal.

## An agent that acted first puts it right

The account's address reaches every project, so before the first call there is no one project whose rules it could give. Codex was connected there and asked to add a task, with these rules in place:

```
Every task you add gets the field area set to wiring.
Start every task title with "kiln: ".
```

Its first call added the task as it was. The reply carried the rules, and a line for exactly this case:

```
add(project: "Kiln", title: "Calibrate the controller's clock")

B-wyd1@1 Calibrate the controller's clock
...
Instructions for this project, from its owner:
Every task you add gets the field area set to wiring.
Start every task title with "kiln: ".
What you just changed was done before you read them: if it goes against them, put it right now.
```

Its next call did:

```
edit(project: "Kiln", key: "B-wyd1@1", title: "kiln: Calibrate the controller's clock", fields: {area: "wiring"})

B-wyd1@3 kiln: Calibrate the controller's clock area:wiring
```

## When each agent hears them

- **When its session starts** , with the open work, for Claude Code and Codex set up by [the hamloy program](https://hamloy.com/docs/the-program). Again after a session is cleared or compacted, and a subagent hears them when it starts.
- **Before its first call** , with the server's instructions, on a project's own address.
- **With its first tool reply** , on any address, the account's too.

When you change them, an agent already at work gets the new ones with its next reply, once. When you take them out, it is told to follow them no longer. The project's owner writes them, up to 2,000 characters.

## What goes here, and what stays in CLAUDE.md

A repo's own file is still the place for how its code is built: the commands, the style, the folders. The project's instructions are for the work itself, and for every agent on it:

- what counts as done ("note how you checked it")
- what waits for you ("firmware is flashed by hand: add a request")
- who a request or question is for, on a project you share
- how much reaches For you ([four lines for that](https://hamloy.com/blog/when-for-you-is-too-long))

They hold in every repo of the project, and for the agent in a browser tab that has no repo.

## Try it

[Create a free board](https://hamloy.com/registration/new), connect the agent you already use, and open the project's **Settings**. More on projects and their settings is in [Projects](https://hamloy.com/docs/projects#instructions-for-assistants).
