[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User]
M1: ACP scaffolding — hello-world stdio server

New module: src/marauder_agent/acp.py — minimal newline-delimited
JSON-RPC 2.0 server over stdio. Handles initialize, authenticate,
session/new, session/prompt (hardcoded reply), session/cancel.
No model loop, no persona, no tools yet — just the wire so Zed can
connect, register BT as a custom agent_server, and get a reply.

New CLI subcommand: marauder-agent acp — wires stdin/stdout to the
ACP loop. Logging routed to stderr (stdout is the wire).

Smoke-tested end-to-end:
  initialize     -> protocolVersion=1
  session/new    -> sessionId=sess_<uuid16>
  session/prompt -> session/update agent_message_chunk
                    + result {stopReason: end_turn}

Cadence: chunk:milestone+stop+pilot-test
Anchor: stable-2026-05-09 (M0 baseline)
Next:   M2 — wire claude-agent-sdk for actual model responses

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Assistant] Applied changes to src/marauder_agent/acp.py, src/marauder_agent/cli.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User]
gen6 dispatch: allow marauder hub as a target

The agent on marauder.saiden.dev subscribes to marauder/marauder/req/task.create
just like the gen6 siblings — but the dispatch CLI's SIBLINGS allow-list
excluded it, so `marauder-cli gen6 dispatch marauder ...` rejected the call.
Status + lifecycle commands already had a wider check; this aligns dispatch.

Verified by echo round-trip: BT-7274 on marauder replied in 8.17s.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[Tool] Edit applied successfully.

[Assistant] Applied changes to cli/gen6.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Update marauder plugin 0.3.0-ed2075a

[Tool] Edit applied successfully.

[Assistant] Applied changes to skills/swarm-pickup/pickup.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User]
refactor(bootstrap): compose op-env from discrete 1P items

Vaultkeeper decision 2026-05-11 21:08 CEST: a single bundled
``op://DEV/marauder-op-env`` item duplicates already-canonical 1P
records. Each token has a primary home — composing the env block
at deploy time gives a single source of truth per credential.

Sources:
- ``op://DEV/marauder-host-dev-env/notesPlain`` — pre-block (broker
  host/port, persona, etc; historical bundle)
- ``op://DEV/hf-marauder/credential`` → HF_TOKEN
- ``op://DEV/cf-marauder/credential`` → CF_API_TOKEN +
  CLOUDFLARE_API_TOKEN (same value, two names for compat)
- ``op://DEV/cf-marauder/account_id`` → CLOUDFLARE_ACCOUNT_ID

Missing items warn but don't fail the step — siblings vary in what
they actually need; HF/CF aren't required everywhere.

Also: switched OP_SSH_KEY references to explicit field paths
(OP_SSH_KEY_PRIVATE, OP_SSH_KEY_PUBLIC) now that vaultkeeper has
canonicalized ``op://DEV/marauder-os-ssh-key`` (Secure Note shape,
fields private_key/public_key/fingerprint).

The bundled-item fallback to ``ssh marauder cat`` is removed — both
ssh-key and op-env now source-of-truth in 1P. No more marauder-hub
SPOF for fresh sibling bootstrap.

[Tool] Edit applied successfully.

[Assistant] Applied changes to cli/gen6_bootstrap.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User]
feat(gen6): expand three-rules preamble with concrete forbidden ops

Pilot directive 2026-05-11 20:48 CEST: "if it's not there list
specific things NOT to do like killing SSHD etc". The previous
preamble was abstract — three high-level rules. This version names
the concrete commands forbidden under each rule, so the deployed
agent sees the operational floor explicitly each turn.

Per-rule expansion:

Rule 1 (no self-disconnect): openvpn stops, sync stops, tun-iface
down, default-route deletion, firewall blackholes AND flushes,
DNS clobber, mesh-config removal.

Rule 2 (no self-process-close): marauder-agent / sync / lifecycle
/ mesh / sysop stops, disables, masks, kills; init kill; shutdowns
and reboots; fork bombs.

Rule 3 (no Pilot/coordinator lockout): sshd stop, authorized_keys
clobber/rm/truncate/chmod-000, /etc/passwd /etc/shadow /etc/sudoers
/etc/ssh/sshd_config clobber, userdel marauder, signing-key
destruction, cron persistence, rm -rf / and friends.

Plus a defense-in-depth note explaining the daemon + safety.py
veto layers below the model.

Pairs with marauder-agent denylist expansion (separate PR) covering
the matching Bash patterns at can_use_tool_full_host.

[Tool] Edit applied successfully.

[Assistant] Applied changes to cli/gen6_bootstrap.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User]
Add GitHub Actions cleanup module

- cli/gh.py: cleanup command with --dry-run and --org flags
- Deletes failed/skipped/cancelled runs and runs older than 2 weeks
- Scans across aladac, saiden-dev, tengu-apps orgs by default
- JSON parsing via stdlib instead of jq pipes

Co-Authored-By: marauder-os <marauder@saiden.dev>

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Assistant] Applied changes to cli/__init__.py, cli/gh.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User]
Add TSR image generation module

- cli/tsr.py: generate/batch/hud/grid/models/status commands
- Parallel batch generation via subprocess.Popen
- Native Python HUD display (no more python3 heredocs in bash)
- Shells out to tsr binary for ComfyUI interaction

Co-Authored-By: marauder-os <marauder@saiden.dev>

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Assistant] Applied changes to cli/__init__.py, cli/tsr.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User]
Add runpod module — merge pod, gpu, and info scripts

Consolidate runpod.sh (134 lines), runpod-gpu.sh (79 lines), and
runpod-info.sh (38 lines) into a single Typer module with nested
sub-apps. GPU tables now use Rich formatting.

Co-Authored-By: marauder-os <marauder@saiden.dev>

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Assistant] Applied changes to cli/__init__.py, cli/runpod.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User]
Add visor, viewport, and kitty modules

- cli/visor.py: snap/status/find — visor pane detection via kitty_windows()
- cli/viewport.py: code render to HUD bridge via httpx POST
- cli/kitty.py: set/get/detect/run/read/send/clear pane management
- All JSON parsing native Python, no more jq or python3 heredocs

Co-Authored-By: marauder-os <marauder@saiden.dev>

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Assistant] Applied changes to cli/__init__.py, cli/kitty.py, cli/viewport.py, cli/visor.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Update marauder plugin 0.1.0

[Tool] Edit applied successfully.

[Assistant] Applied changes to skills/things/things.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User]
Add delete verb to daemon dispatch and verbs module

Extends Worker._dispatch with 'delete' (mirrors save pattern), accepts
args.name or args.id, validates non-null, calls verbs.do_delete which
resolves name->id case-insensitively and drops via tapo.deletePreset.
FakeTapo gained deletePreset; self-test grew from 11 to 14 enqueued
commands (7 motor / 7 errors / 1 reachable = 15 publishes).

Needed because spinning up a parallel pytapo session for cleanup conflicts
with the daemon's existing session (Tapo error -40214). All preset
mutations now flow through the daemon's single Tapo client per cam.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Assistant] Applied changes to verbs.py, worker.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User]
Wire save verb into Worker dispatch with arg validation and self-test coverage

Daemon now handles 'save' verb (was missing — only CLI in main.py knew it).
Validates args.name is a non-empty string, calls verbs.do_save which wraps
tapo.savePreset. FakeTapo gained savePreset mimicking auto-id assignment;
self-test covers happy path, missing args, and empty-string args.

Closes the daemon gap so MQTT-driven preset save (and visor / future tooling)
works end-to-end.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[Tool] Edit applied successfully.

[Assistant] Applied changes to worker.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Republish per-cam status/reachable in on_connect for clean broker reconnects

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Assistant] Applied changes to mqtt_daemon.py, worker.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Add exponential auth-failure backoff to Worker._ensure_tapo (1s..60s cap)

[Tool] Edit applied successfully.

[Assistant] Applied changes to worker.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Add per-cam heartbeat with retained status/reachable and area-aware publisher

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Assistant] Applied changes to mqtt_daemon.py, worker.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Add CleanupThread for hourly TTL prune of snapshot dir, integrate into daemon

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Assistant] Applied changes to cleanup.py, mqtt_daemon.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Route snap to event/snapshot with sha256+url and start SnapshotServer in daemon

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Assistant] Applied changes to mqtt_daemon.py, worker.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Reorder on_connect to subscribe-first and add diagnostic logs to fix paho subscription routing

[Tool] Edit applied successfully.

[Assistant] Applied changes to mqtt_daemon.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Wire worker dispatch to verbs.py and document single daemon-level LWT

[Tool] Edit applied successfully.

[Assistant] Applied changes to worker.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Refactor main.py CLI to delegate to verbs.py

[Tool] Edit applied successfully.

[Assistant] Applied changes to main.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Add OP_SERVICE_ACCOUNT_TOKEN mode and load_secrets preloader for daemon use

[Tool] Edit applied successfully.

[Assistant] Applied changes to op.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Pin setup_desk.py to c225 explicitly to lock target across DEFAULT_CAM changes

[Tool] Edit applied successfully.

[Assistant] Applied changes to config/setup_desk.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User]
Fix setup: intelligent motor polling instead of blind sleep

Replace fixed sleep timers with wait_motor() that polls moveMotor(1,0)
every 3s until MOTOR_BUSY clears. Calibrate takes ~17s, no more guessing.
Also use calibrateMotor() between presets for reliable home return.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

[Tool] Edit applied successfully.

[Assistant] Applied changes to config/setup_desk.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User]
Reduce camera settle time from 1.5s to 0.7s for faster sweeps

C225 does 120°/s, 60° step = 0.5s travel. Old 1.5s settle was overly
conservative. Saves ~7s on a full 9-frame sweep.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

[Tool] Edit applied successfully.

[Assistant] Applied changes to main.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User]
Add 3x3 grid sweep command for full FOV coverage

Snake-pattern sweep: C -> TL -> T -> TR -> R -> BR -> B -> BL -> L.
Snaps a timestamped frame at each of the 9 positions, then returns
to the first preset. ~30 seconds for a complete room scan.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

[Tool] Edit applied successfully.

[Assistant] Applied changes to main.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] v0.1.2 — repo transfer to saiden-dev

[Tool] Edit applied successfully.

[Assistant] Applied changes to src/haracz/__init__.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User]
Bump version to 0.1.1

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

[Tool] Edit applied successfully.

[Assistant] Applied changes to src/haracz/__init__.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Add --detailed flag for month-by-month breakdown with change markers

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Assistant] Applied changes to src/haracz/cli/app.py, src/haracz/cli/formatters.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Fix ryczalt health tiers: month-by-month cumulative tracking, correct 2025 amounts

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Assistant] Applied changes to src/haracz/calculators/jdg_ryczalt.py, src/haracz/config.py, tests/test_jdg_ryczalt.py.


[System]
You are a Python coding agent. Execute implementation tasks precisely and completely.

## Constraints

- Type hints on ALL new function signatures (params + return)
- `pathlib.Path` over `os.path` for filesystem operations
- `uv` for dependency management if `pyproject.toml` present — never raw `pip install`
- Pydantic v2 for data models (no v1 `BaseModel` patterns: `.dict()` → `.model_dump()`)
- `pytest` + `pytest-asyncio` for testing — no `unittest`, no `nose`
- `ruff` for lint + format — respect existing `ruff.toml` / `pyproject.toml [tool.ruff]`

## Workflow

1. Read `pyproject.toml` (or `setup.py`, `requirements.txt`) to understand deps and tooling
2. Check for `ruff.toml`, `.flake8`, `mypy.ini` — respect existing lint config
3. Match existing style — run `git log -5 --oneline` for commit convention
4. Implement with focused, minimal diffs
5. Run `ruff check .` — fix violations
6. Run `ruff format .` — apply formatting
7. Run `pytest` (or project-specific test command) — fix failures
8. If `mypy` is configured: run `mypy --strict <changed_paths>` — fix type errors

## Verification

After every change cycle:
```
ruff check .
ruff format --check .
pytest                    # (or project-specific test command)
```

If mypy is in the project's dev dependencies, also:
```
mypy --strict <changed_files>
```

All must pass before reporting success.

## Framework Detection

Check project structure:
- `app/` + `manage.py` → Django
- `app.py` or `main.py` with `Flask` import → Flask
- `main.py` with `FastAPI` → FastAPI (use `uvicorn` to test-run)
- `noxfile.py` → use `nox` for test orchestration
- `tox.ini` → use `tox` for test orchestration

Follow the framework's conventions for route definitions, middleware, configuration.

## Commit Style

- Stage only changed files: `git add <paths>`
- Match repo's format (check `git log -5 --oneline`)
- Common format: `<type>(<scope>): <subject>`

## Memory Trail

After completing work, store results:
- What you built, file paths, key decisions → subject: `project.<name>.build-result`
- Anything unresolved or worked around → subject: `project.<name>.unresolved`
- Things you noticed out of scope → subject: `project.<name>.out-of-scope`
- Bugs found and how you fixed them → subject: `project.<name>.errors`

[User] Switch compare to employee-oriented mode by default, add --employer-budget flag

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Tool] Edit applied successfully.

[Assistant] Applied changes to src/haracz/cli/app.py, src/haracz/compare.py, tests/test_compare.py.